我试图制作异构容器。
因此可以有任意数量的结构S1, S2 ... SN
(在下面的示例中只有2个)和一个包装器,它可以包含标记联合中的每个结构。
结构体具有相同的方法但不实现接口(它们必须是POD或至少是文字类型才能成为联合的一部分)。
我想找到一种方法来避免下面的丑陋宏。这是我发现避免重复代码的唯一方法。我试过弄乱模板,但我没有经过足够的实验。
我知道我可以使用带有虚拟方法的类层次结构,但这是一个实验。我正在寻找一种不使用Boost库并且与c ++ 11兼容的解决方案。
#include <iostream>
#include <vector>
using namespace std;
struct S1 {
void f1() const { cout << "S1:f1" << endl; }
void f2() const { cout << "S1:f2" << endl; }
};
struct S2 {
void f1() const { cout << "S2:f1" << endl; }
void f2() const { cout << "S2:f2" << endl; }
};
struct Wrapper {
enum class Type : size_t {
T1,
T2
} type;
union {
const S1 s1;
const S2 s2;
};
Wrapper(S1 s1): type{Type::T1}, s1{s1} {}
Wrapper(S2 s2): type{Type::T2}, s2{s2} {}
#define FUNC(func_name) void func_name() {\
switch (type) {\
case Type::T1: s1.func_name(); break;\
case Type::T2: s2.func_name(); break;\
}\
}
FUNC(f1)
// void f1() {
// switch (type) {
// case Type::T1: s1.f1(); break;
// case Type::T2: s2.f1(); break;
// }
// }
FUNC(f2)
// void f2() {
// switch (type) {
// case Type::T1: s1.f2(); break;
// case Type::T2: s2.f2(); break;
// }
// }
};
int main() {
vector<Wrapper> vec;
vec.push_back(Wrapper(S1()));
vec.push_back(Wrapper(S2()));
for (Wrapper w : vec) {
w.f1();
w.f2();
}
}