2017-06-13 41 views
1

说我有一组模板template<int N> A{}template<int N> B{}等与模板CD ....他们都有一个静态成员函数init()生成模板实例的列表,并呼吁他们的静态函数

我想写一个元函数生成A<0>,B<1>,C<2>等等。让我们命名这个可变元函数SeqInst。而且这个元功能还有一个静态成员函数init(),后者又调用所有的A<0>::init(),B<1>::init()等。

我试着写SeqInst为variadoc模板,然后实例SeqInst<A, B, C>并以此来形成一个参数列表另一个模板Initializer: 所以SeqInst里面我喜欢用:

template<typename... T> 
struct Initializer { 
    static void init() {(T::init(), ...);} 
}; 

毕竟这应该是这样的:

using si = SeqInst<A,B,C>; 
si::init(); 

这应该在结束通话A<0>::init()B<1>::init()等。

回答

2

这是std::index_sequence的工作。我们只是让大小合适的序列,并用它来打电话init()而折叠逗号:

template <template <int> class... Z> 
struct SeqInst { 
    static void init() { 
     init(std::make_index_sequence<sizeof...(Z)>{}); 
    } 

private: 
    template <size_t... Is> 
    static void init(std::index_sequence<Is...>) { 
     (Z<Is>::init(), ...); 
    } 
}; 
+0

是否可以实例化一个嵌套的可变参数的类模板与参数'一个<0>','乙<1> '等等? – wimalopaan

+0

嗯,我的意思是没有函数init()... – wimalopaan