mixins-from-below, . , . () .
, :
#include<cstdio>
struct RS485 {
void send(const char *data) {
printf("RS485: %s \n", data);
}
};
struct I2C {
void send(const char *data) {
printf("I2C: %s \n", data);
}
};
struct BT {
void send(const char *data) {
printf("BT %s \n", data);
}
};
template<typename Comm>
struct MODBUS: private Comm {
void send(const char *data) {
printf("MODBUS\n");
Comm::send(data);
}
};
template<typename Comm>
struct TCP: private Comm {
void send(const char *data) {
printf("TCP\n");
Comm::send(data);
}
};
int main() {
MODBUS<I2C> mb_i2c{};
mb_i2c.send("Data ...");
MODBUS<RS485> mb_rs{};
mb_rs.send("Data ...");
TCP< MODBUS<RS485> > tcp_modbus_rs{};
tcp_modbus_rs.send("Data ...");
}
, , .
:
template<typename Comm>
struct MODBUS: private Comm {
template<typename... T>
MODBUS(T&&... t): Comm{std::forward<T>(t)...} {}
void send(const char *data) {
printf("MODBUS\n");
Comm::send(data);
}
};
, :
#include<cstdio>
#include<utility>
struct RS485 {
RS485(int) {}
void send(const char *data) {
printf("RS485: %s \n", data);
}
};
struct I2C {
I2C(char, double) {}
void send(const char *data) {
printf("I2C: %s \n", data);
}
};
struct BT {
void send(const char *data) {
printf("BT %s \n", data);
}
};
template<typename Comm>
struct MODBUS: private Comm {
template<typename... T>
MODBUS(T&&... t): Comm{std::forward<T>(t)...} {}
void send(const char *data) {
printf("MODBUS\n");
Comm::send(data);
}
};
template<typename Comm>
struct TCP: private Comm {
template<typename... T>
TCP(T&&... t): Comm{std::forward<T>(t)...} {}
void send(const char *data) {
printf("TCP\n");
Comm::send(data);
}
};
int main() {
MODBUS<I2C> mb_i2c{'c', .3};
mb_i2c.send("Data ...");
MODBUS<RS485> mb_rs{42};
mb_rs.send("Data ...");
TCP< MODBUS<RS485> > tcp_modbus_rs{23};
tcp_modbus_rs.send("Data ...");
}