次のコードは、メンバ関数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 *'でインスタンス化されないようにする方法はありますか?そうでない場合、この問題を避けるためにヘルパークラスを設計するより良い方法は何ですか?
[std :: enable_if](http://en.cppreference.com/w/cpp/types/enable_if)を確認することができます。 – Mine