c++ - 按照运行时定义的顺序遍历 C++ 元组

标签 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 方法,但可以按任意顺序(例如,由 的值定义) 等级成员。

最佳答案

您将需要实现某种类型删除才能实现这一点。类似的东西

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,但它们都归结为相同的原理类型删除。我只是提供了该删除的最简单实现。

关于c++ - 按照运行时定义的顺序遍历 C++ 元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918596/

相关文章:

c++ - STL 容器及其元素的常量性——何时使用常量?

c++ - Typedef 的问题——需要忽略某些代码

c++ - 在 C++ 的链表中通过 "<<"打印对象

javascript - meteor :未捕获类型错误:无法读取未定义的属性 'events'

c++ - 使用 std::array<Type, N> 的实例作为模板参数

lambda - 使用 gdb 调试 lambdas 有什么好运气吗?

c++ - STL 列表访问倒数第二个元素

c++ - 将文件拆分为 .cpp 和 .h 会减少编译时间吗?

c++ - 查找目录及其子目录中的所有文件

c++ - 如何使用一个方法作为另一个方法的参数?