2012-03-12 40 views
16

私は現在、次のコード、可変長可変長引数テンプレートテンプレートを実装することであることを意図して苦労しています:理想的には可変個引数可変引数テンプレートテンプレート

template 
< 
    template <typename... HeadArgs> class Head, 
    template <typename... TailArgs> class... 
> 
struct join<Head<typename HeadArgs...>, Head<typename TailArgs...>...> 
{ 
    typedef Head<typename HeadArgs..., typename TailArgs......> result; 
}; 

、私は達成するために、このテンプレートメタ関数を使用することができるだろう次

template <typename...> struct obj1 {}; 
template <typename...> struct obj2 {}; 

typedef join 
< 
    obj1<int, int, double>, 
    obj1<double, char>, 
    obj1<char*, int, double, const char*> 
>::result new_obj1; 

typedef join 
< 
    obj2<int, int, double>, 
    obj2<double, char>, 
    obj2<char*, int, double, const char*> 
>::result new_obj2; 

/* This should result in an error, because there are 
    different encapsulating objects 
typedef join 
< 
    obj1<int, int, double>, 
    obj1<double, char>, 
    obj2<char*, int, double, const char*> 
>::result new_obj; 
*/ 

上記の出力は、願わくは形態でnew_obj1new_obj2を作成しtemplate<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};

私は出力のWindows上でGCC 4.6.2を使用しています「の前に期待されるパラメータパックを 『...』」の拡大のために、 『Head<typename TailArgs...> ...』。

This error is reproducable with gcc 4.5.1

+0

引数*名前を。実際のパラメータとしては実際には利用できません。 –

+0

@KerrekSBテンプレートテンプレートパラメータのパラメータを取得する方法はありますか? – kmore

+0

私の投稿を編集しました。私はvariadicの場合を逃していました。あなたの質問に答えて:はい、明示的なテンプレートパラメータ(パック)とマッチングを提供します。 –

答えて

18

このような何か試してみてください:テンプレートテンプレート引数の `template`仕様はオプションと全く化粧品である内側*

template <typename...> struct join; 

template <template <typename...> class Tpl, 
      typename ...Args1, 
      typename ...Args2> 
struct join<Tpl<Args1...>, Tpl<Args2...>> 
{ 
    typedef Tpl<Args1..., Args2...> type; 
}; 

template <template <typename...> class Tpl, 
      typename ...Args1, 
      typename ...Args2, 
      typename ...Tail> 
struct join<Tpl<Args1...>, Tpl<Args2...>, Tail...> 
{ 
    typedef typename join<Tpl<Args1..., Args2...>, Tail...>::type type; 
}; 
+0

これは、2つのオブジェクトのパラメータを組み合わせるときの完璧なソリューションです。しかし、私は可変数のオブジェクトのパラメータを組み合わせることを検討しています。私は、[変更](http://ideone.com/njBuE)あなたの答えを試してみましたが、拡張パックとの誤差がまだあります。 **編集:あなたはそれに私を打つ、ありがとう!** – kmore