2016-03-30 12 views
0

次のコードは、メンバ関数A :: Getを文字列リテラルで呼び出すときに静的になります。これは、関数のオーバーロードの名前解決が選択されているかどうかに関係なくテンプレートをインスタンス化する必要があるためです。関数名解決時のstatic_assertトリガ

template<typename T> 
struct helper 
{ 
    static_assert(std::is_integral<T>::value, "Must be integeral type"); 

    typedef T type; 
}; 

class A 
{ 
public: 
    A() 
    {} 

    std::string Get(const char* value) const 
    { 
     return std::string(value) + " (non-template)"; 
    } 

    template<typename T> 
    typename helper<T>::type Get(T value) const 
    { 
     return value; 
    } 
}; 

私はしかし、ヘルパークラスを使用している他の状況があり、「ヘルパー」特殊化を追加することにより、アサートを停止することができ、それが他の状況で「constのchar型*」のために特化しても意味がありません。 。

この場合、helper :: typeが 'const char *'でインスタンス化されないようにする方法はありますか?そうでない場合、この問題を避けるためにヘルパークラスを設計するより良い方法は何ですか?

+0

[std :: enable_if](http://en.cppreference.com/w/cpp/types/enable_if)を確認することができます。 – Mine

答えて

0

テンプレート化されたGetメソッドをconst char*でインスタンス化しないようにする場合は、std::enable_ifを使用できます。そうすれば、Tのタイプがconst char*のときに機能を無効にすることができます。ここでstd::enable_ifを使用してGetメソッドの実装です:

template<typename T> 
typename helper<typename std::enable_if<!std::is_same<const char*, T>::value>::type>::type Get(T value) const 
{ 
    return value; 
} 

それはかなり長いですが、それはconst char*場合のhelper<T>を専門とする必要がなくなります。これは、Tconst char*の場合、メソッドをオーバーロード解決から削除して動作します。

std::is_samehereのドキュメントを参照してください。どちらのタイプも<type_traitsヘッダーにあります。

関連する問題