例えば
template <typename T>
T foo(){ ... }
ここで、T は浮動小数点型、つまり float / double / long double のみにすることができます
例えば
template <typename T>
T foo(){ ... }
ここで、T は浮動小数点型、つまり float / double / long double のみにすることができます
template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type foo() { ... }
これは完全に標準の SFINAE です。戻り値の型を有効にします。T が浮動小数点型でない場合は、型定義が提供され、提供されないためstd::is_floating_point<T>::value
、false
関数がコンパイルできなくなります。std::enable_if<false, T>
type
これらの標準ライブラリ クラスについては、http://en.cppreference.com/w/cpp/typesを参照してください。
はい、テンプレートの特殊化とSFINAEを使用します。
template<typename T>
struct foo_enabled
{
};
template<>
struct foo_enabled<float>
{
typedef void *value;
};
template<>
struct foo_enabled<double>
{
typedef void *value;
};
template<>
struct foo_enabled<long double>
{
typedef void *value;
};
template <typename T>
T foo(typename foo_enabled<double>::value=NULL){ ... }
当然、C ++ 11を使用している場合、AndreiTitaのソリューションはよりスマートです。