2017-04-02 8 views
0

です。たとえば、は、私は、テンプレートの種類を持っている与えられたテンプレートの種類

tuple< Shadow<int>, Shadow<double> > x; // correct instantiation. 
tuple< Shadow<int>, double > x; // incorrect instantiation. 

これを実現するにはどうしたらよいですか(インスタンス化が正しくない場合はコンパイラフラグにエラーがあります)。あなたはタイプの別名を使用することができ

+0

は 'tuple''のstdです:: tuple'またはあなたが定義するクラス? – kennytm

+0

それはstd :: tupleである必要はありません、私はラップすることができます。 – user1205476

答えて

2

私は想像することができるソリューションは、可変個引数テンプレート構造体(またはクラス)でタプルをラップで

#include <tuple> 

template <typename T> 
struct Shadow 
{ T field[100]; }; 

template <typename ... Ts> 
struct wrapTShadow 
{ std::tuple<Shadow<Ts>...> val; }; 

int main() 
{ 
    // contain a std::tuple<Shadow<int>, Shadow<double>> 
    wrapTShadow<int, double> wts; 
} 
+0

この提案をありがとう。 std :: tuple ...>はどうしますか?私はあなたがShadow を呼び出すことができないことに困惑していますが、 "struct Shadow"はバリデーショナルテンプレートを受け入れません! – user1205476

+1

@ user1205476 - 'std :: tuple >'と 'std :: tuple ...>を区別する必要があります。 「... Ts」は「T1、T2、T3」であるとする。 'std :: tuple >'は 'std :: tuple >'として解凍されています(あなたの場合は間違っています)。 'std :: tuple ...' 'はstd :: tuple 、Shadow 、Shadow >'で解凍されています(これはあなたが必要としているものです)。 – max66

+0

@ user1205476 - ps:look also also alangabのソリューションでは同じ考え方に基づいていますが、構造体をラップする必要はありません。よりシンプルで洗練されていて、より効率的です – max66

2

template<class ...Args> 
using shadow_tuple = std::tuple<Shadow<Args>...>; 

int main() 
{ 
    shadow_tuple<int, double> xx; 
    return 0; 
} 
関連する問題