以运行时定义的顺序遍历C ++元组

时间:2012-01-18 22:41:04

标签: c++ templates c++11 tuples boost-tuples

可以迭代boost或std元组,但是我可以迭代在运行时确定的顺序,同时仍然保留类型信息吗?

假设我的元组填充了Foo类型的对象:

#include <tuple>

using namespace std;

template <typename ...> void bar(); // Definition omitted.

template <typename ... Ts>
struct Foo {
  void doit() { bar<Ts...>(); }
  int rank;
};

int main(int argc, char *argv[])
{
  auto tup = make_tuple(Foo<int,double>(),
                        Foo<bool,char,float>());
  get<0>(tup).rank = 2;
  get<1>(tup).rank = 1;
  return 0;
}

我希望能够遍历Foo类型的列表,调用它们的doit方法,但是按照rank成员的值定义的任意顺序

1 个答案:

答案 0 :(得分:3)

为了实现这一点,您需要实现某种类型的擦除。

的内容
template <typename ...> void bar(); // Definition omitted.

struct FooBase {
    virtual void doit() = 0;
    int rank;
};

template <typename ... Ts>
struct Foo : public FooBase {
  void doit() { bar<Ts...>(); }
};

int main(int argc, char *argv[])
{
  auto tup = make_tuple(Foo<int,double>(),
                        Foo<bool,char,float>());
  get<0>(tup).rank = 2;
  get<1>(tup).rank = 1;
  std::vector<FooBase*> bases;
  // fill bases
  // sort
  // call
  return 0;
}

您可以应用其他功能的机制,例如,并且不需要修改Foo,但它们都归结为相同的原理类型擦除。我只提供了最简单的擦除实现。