2009-05-26 10 views
0

ちょっと、私は、式のパラメータでテンプレートクラスの定義を「オーバーロードする」ことができるかどうかを調べようとしています。次のコードスニペットのようなものです。テンプレートクラスの式のパラメータのオーバーロード

template<class T> 
class Test 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 5; 
     cout << "Testvar: " << testvar << endl; 
    } 
}; 

template<class T> 
class Test<T, int num> 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 10; 

     cout << "Testvar: " << testvar << endl; 
     cout << "Param: " << num << endl; 
    } 
}; 

ありがとうございます。

編集:記録のために、私はそれは明らかではなかった場合はC++でこれをやろうとしている... :)

答えて

2

テンプレートは、あなたがしているものと同様のものを提供することができ、デフォルトのテンプレートパラメータを、許可します探し..

template<class T, int num = -1> 
class Test 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = (num == -1 ? 10 : 5); 

     cout << "Testvar: " << testvar << endl; 
     if (num != -1) 
      cout << "Param: " << num << endl; 
    } 
}; 
+0

ありがとう、それは私が探していたものでした。 – Morgan

1

あなたがTestのためだけに1つのテンプレート引数を指定できるようにしたい場合は、Shmoopty suggestsとして、デフォルトのテンプレートパラメータを宣言する必要があります。

それは部分的に異なるパラメータ値のために特化することも可能です:これは、それがわずかに速く(何のランタイムテストが実行されません)になり、追加の例がすることができますifまたはswitch文の必要性を回避する

// This base template will be used whenever the second parameter is 
// supplied and is not -1. 
template<class T, int num = -1> 
class Test 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 10; 
     cout << "Testvar: " << testvar << endl; 
     cout << "Param: " << num << endl; 
    } 
}; 

// This partial specialisation will be chosen 
// when the second parameter is omitted (or is supplied as -1). 
template<class T, int num> 
class Test<T, -1> 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 5; 
     cout << "Testvar: " << testvar << endl; 
    } 
}; 

後に付加的な部分的専門化の形で「グラフト化」される。 (どのアプローチがより明確であるかは、個人的な好みの問題です。)