2017-05-04 9 views
1

以下のコードでは、一連の値を特殊化することが可能かどうか疑問に思っていました。私の例では、既知のサイズの配列を使用するためにN=3またはN=4の特殊化を作成したいと考えています。この場合、コードの重複を避けることは可能ですか?テンプレートを2つの異なる値に特化する方法は?

template <typename T, unsigned int N> 
class A 
{ 
public: 
    T* data; 
}; 

template <typename T> 
class A<T, 3> 
{ 
public: 
    T data[3]; 
}; 

template <typename T> 
class A<T, 4> 
{ 
public: 
    T data[4]; 
}; 

int main() 
{ 
    A<int, 1> u; 
    std::cout << sizeof(u.data) << std::endl; // Size of pointer 

    A<int, 3> v; 
    std::cout << sizeof(v.data) << std::endl; // Size of data 

    A<int, 4> w; 
    std::cout << sizeof(w.data) << std::endl; // Size of data 

    return 0; 
} 

答えて

3

あなたは一般的なケースでデフォルトvoidテンプレートパラメータを導入することにより、std::enable_ifを使用することができます。

template <typename T, unsigned int N, typename = void> 
class A 
{ 
public: 
    T* data; 
}; 

template <typename T, unsigned int N> 
class A<T, N, typename std::enable_if<N == 3 || N == 4>::type> 
{ 
public: 
    T data[N]; 
}; 

live wandbox example


N == 3 || N == 4trueある場合、typename std::enable_if<N == 3 || N == 4>::type整形voidに評価されます。その後、専門化が選択されます。

N == 3 || N == 4falseであれば、typename std::enable_if<N == 3 || N == 4>::type病気-形成で、専門は "を離れSFINAEd" です。一般的な場合が選択されます。

+0

恐ろしいです。私はこれがC++のメタプログラミングの一種だと思いますか?私はそれに慣れていないし、知っているので、私は本をつかむことができ、 "SFINAEd"私は理解していないので、それを学ぶことができます。 – BRabbit27

+0

@ BRabbit27:はい、これはメタプログラミングの一形態です。 (申し訳ありませんが)私は本当に本を持っていませんが、 "sfinae"と "template metaprogramming C++ 11"の場合は、おそらく役に立つリソースが見つかります。 –

関連する問題