2017-01-21 3 views
2

私は最近、問題を考えました。のは、このような可変長引数のテンプレートがあるとしましょう:バリデーションテンプレートクラスの定義のバリエーション数

template <typename... Types> 
class example 
{ 
    //something 
}; 

今、私が達成したいものを、私はexample<int, double, float>のオブジェクトを作成するときに、このテンプレートインスタンスがコンパイルされるということです。

class example<int, double, float> 
{ 
    int int_array[5]; 
    double double_array[5]; 
    float float_array[5]; 
} 

そして、私はexample<char, long, myClass2, myClass3>のオブジェクトを作成し、クラステンプレートのこのインスタンスが生成されます。

class example<char, long, myClass2, myClass3> 
{ 
    char char_array[5]; 
    long long_array[5]; 
    myClass2 myClass2_array[5]; 
    myClass3 myClass3_array[5]; 
} 

そこで、基本的、TEMの各可変長引数リストについてプレートのパラメータ、渡されたすべての型名のアクションを繰り返します。私の例では、バリデーショナルテンプレートに渡された各型の5要素配列を宣言しました。名前は "type_array"である必要はありません。渡される型ごとに(変数を宣言するなどの)アクションを実行できる限り、何でも構いません。

これは可能ですか?

答えて

5

うーん...私はあなたが相続

#include <string> 
#include <iostream> 

template <typename T> 
struct wrp 
{ T a[5]; }; 

template <typename ... Ts> 
struct example : public wrp<Ts>... 
{ }; 

int main() 
{ 
    example <int, float, std::string> e0; 

    e0.wrp<int>::a[0] = 1; 
    e0.wrp<float>::a[0] = 1.1f; 
    e0.wrp<std::string>::a[0] = "1.11"; 

    std::cout << e0.wrp<int>::a[0] << std::endl;   // print 1 
    std::cout << e0.wrp<float>::a[0] << std::endl;  // print 1.1 
    std::cout << e0.wrp<std::string>::a[0] << std::endl; // print 1.11 
} 
+0

を使用することができると仮定しますが、コードをテストしましたように動作しますか? (今は私の手に届いたコンパイラ/ IDEを持っていません。私は興味があります) – KKZiomek

+0

@KKZiomek - 3枚のプリントを追加し、コンパイルして動作させる例を変更しました。 g ++(4.9.2)とclang ++(3.5) – max66

+0

ありがとう、それはまさに私が探していたものです! – KKZiomek

関連する問題