2013-04-22 10 views
5

特定のプリミティブタイプのみを許可するには、テンプレートクラス内でメソッドを特殊化する必要があります。 、テンプレートメソッド内のテンプレートクラス

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    X& get(const arg_type var); 
} 

私は唯一の符号なし整数を許可するARG_TYPEを専門にしたいと思い、このような何か:

template<typename TYPE, size_t NB> template<unsigned long> X& X::get(const unsigned long val); 

さて、私はこのクラスを持っている(これはthisの重複問題ではありません)

しかし、必ず、上記の私は何をしようとすると、テンプレートに基づいてコードを書くことで、より具体的にはmsvc2011にもgccの

でもない、動作しません。このクラスXを使用している人は誰もが私の専門とは違う方法でこのメソッドを使うことができないように特殊化を記述してください。

これは可能ですか?もしそうなら、そうするのは悪いですか?事前に

おかげで、 jav974

+1

入れ子にされたテンプレートを持つのが最良のアプローチだと思うのはなぜですか?この作業を行うことができますが、ネストされたテンプレートを持たず、テンプレート以外の過負荷だけのような、もっとクリーンな単純なソリューションがあるかもしれません... –

答えて

4

専門は、あなたが望むものではありません。特殊化を使用すると、符号なし整数型を使用してテンプレートメソッドのインスタンス化を処理する特別な方法を提供できますが、ユーザーが別の型でインスタンス化することはできません。

あなたは、いくつかのSFINAEを使用して、これを達成することができます:ユーザーがよりフレンドリーエラーメッセージを取得するように、

#include <type_traits>  

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    typename std::enable_if<std::is_unsigned<arg_type>::value, X&>::type // arg_type is unsigned 
    get(arg_type val) 
    { 

    } 
}; 

ます。またstatic_assertを使用することができます。

template<typename arg_type> 
X& get(arg_type val) 
{ 
    static_assert(std::is_unsigned<arg_type>::value, "The argument should be unsigned!"); 
} 

をあなたがするTYPEテンプレートパラメータをしたい場合同じ規則に従ってください。static_assert

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    static_assert(std::is_unsigned<TYPE>::value, "TYPE should be unsigned!"); 
}; 
+0

恐ろしいですね!私はそれについて知らなかった、ありがとう!ところで、クラスの 'TYPE'も同じルールに従うべきですが、このチェックをどこに置くべきですか? ctor? – jav974

+0

@ jav974私の編集を参照してください。 – mfontanini

+0

ありがとう、私はそれを解決マーク! – jav974

関連する問題