我需要使用异构元素实现一些可变参数模板容器类,这允许通过这些元素进行迭代。我的第一个想法是使用带有可变参数的std :: tuple成员生成类,但是通过类似数组的方式(通过循环)从元组中获取元素是不可能的:
struct A {void prnt(){std::cout<<"A\n";} };
struct B {void prnt(){std::cout<<"B\n";} };
struct C {void prnt(){std::cout<<"C\n";} };
template<typename...Arg>
struct Prc
{
Prc() : NumElems(sizeof...(Arg)), mems(std::make_tuple(Arg()...)){}
int NumElems;
std::tuple<Arg...> mems;
void process()
{
for(int i=0; i<NumElems; ++i)
std::get<i>(mems).prnt();//It's forbidden: "i" must be a constant
}
};
int main()
{
Prc<A,B,C> obj;
obj.process();
}
有什么想法吗?
P.S。我不想使用boost异类容器,例如 boost :: variant 或 boost :: any
答案 0 :(得分:3)
这是使用指标完成的:
namespace detail
{
template <int... Is>
struct index { };
template <int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };
template <int... Is>
struct gen_seq<0, Is...> : index<Is...> { };
}
template <typename...Args>
struct Prc
{
std::tuple<Args...> mems;
template <int... Is>
void process(detail::index<Is...>)
{
auto l = { (std::get<Is>(mems).prnt(), 0) ... };
}
void process()
{
process(detail::gen_seq<sizeof...(Args)>());
}
};
答案 1 :(得分:1)
以下是一些迭代元组的代码:
struct A { void print () { clog << "A" << endl; } };
struct B { void print () { clog << "B" << endl; } };
struct C { void print () { clog << "C" << endl; } };
template<unsigned N>
struct iter
{
template<typename T>
static void f (T &t)
{
iter<N-1>::f (t);
get<N> (t).print ();
}
};
template<>
struct iter<0>
{
template<typename T>
static void f (T &t)
{
get<0> (t).print ();
}
};
调用代码:
tuple <A,B,C> t;
iter<tuple_size<decltype(t)>::value-1>::f (t);
我认为您可以修改它以满足您的需求。代码中的NumElements在编译时是已知的,所以我认为你会完全删除该成员。