2013-07-28 65 views
2

我需要实现一些带有异构元素的可变参数模板容器类,它允许迭代这些元素。我最初的想法是让与可变参数的std ::元组成员类,但(通过循环)正从元组元素通过阵列状的方式是不可能的:Variadic模板异构容器

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 ::任何

+2

(http://loungecpp.wikidot.com/tips-and-tricks:indices) – Xeo

+0

我不知道你所说的“是什么意思大规模的方式“。 – jsp

回答

3

这是它做使用indicies:[指数]

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)>()); 
    } 
}; 
+0

为什么我不能替换“命名空间细节”?在这种情况下不能编译。 – gorill

+0

@gorill对不起,我在原始代码中犯了一些错误。我更新了我的答案,请看看。 – 0x499602D2

+0

没关系)))我找到了他们))) – gorill

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在编译时是已知的,所以我认为你会完全删除该成员。