如何制作异构容器?

时间:2017-11-12 21:26:33

标签: c++ c++11 containers unions

我试图制作异构容器。

因此可以有任意数量的结构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();
  }
}

0 个答案:

没有答案