可以迭代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
成员的值定义的任意顺序
答案 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,但它们都归结为相同的原理类型擦除。我只提供了最简单的擦除实现。