1

例えば

template <typename T>
T foo(){ ... }

ここで、T は浮動小数点型、つまり float / double / long double のみにすることができます

4

2 に答える 2

6
template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type foo() { ... }

これは完全に標準の SFINAE です。戻り値の型を有効にします。T が浮動小数点型でない場合は、型定義が提供され、提供されないためstd::is_floating_point<T>::valuefalse関数がコンパイルできなくなります。std::enable_if<false, T>type

これらの標準ライブラリ クラスについては、http://en.cppreference.com/w/cpp/typesを参照してください。

于 2013-02-15T18:46:38.730 に答える
3

はい、テンプレートの特殊化と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のソリューションはよりスマートです。

于 2013-02-15T18:47:55.387 に答える