2012-08-15 3 views
9

は、次のコードを考えてみましょう:あなたはトリックが正しく、この例の2行目にベースのテンプレートパラメータを生成するために存在していることをサイズとその内容からvariadicテンプレートパックを生成できますか?

template<unsigned int... TSIZE> 
struct Base {}; 
template<unsigned int TORDER, unsigned int TDIM> 
struct Derived : public Base</* TDIM, TDIM, ... TDIM (TORDER times) */> {}; 

と思いますか?たとえば、Derived<3, 5>Base<5, 5, 5>から継承したいとします。どうやってするか ? TMPのビットで

答えて

10

が、これはすべての後にそれは難しいことではありません。

template<unsigned ToGo, class T, T Arg, template<T...> class Target, T... Args> 
struct generate_pack 
    : generate_pack<ToGo-1, T, Arg, Target, Args..., Arg> 
{ // build up the 'Args' pack by appending 'Arg' ... 
}; 

template<class T, T Arg, template<T...> class Target, T... Args> 
struct generate_pack<0, T, Arg, Target, Args...> 
{ // until there are no more appends to do 
    using type = Target<Args...>; 
}; 

template<unsigned Num, class T, T Arg, template<T...> class Target> 
using GeneratePack = typename generate_pack<Num, T, Arg, Target>::type; 

template<unsigned int... TSIZE> 
struct Base{}; 

template<unsigned int TORDER, unsigned int TDIM> 
struct Derived 
    : GeneratePack<TORDER, unsigned, TDIM, Base> 
{ 
}; 

Live example.

+0

ああ、あなたは再帰的に導き出すことができますか?カッコいい。 – jrok

+1

Boost.MPLの著者によるテンプレートメタファンクション転送と呼ばれています。 – TemplateRex

関連する問題