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>::value将提供false并且std::enable_if<false, T>不提供typetypedef,这会导致函数不可编译。

有关这些标准库类的信息,请参见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,Andrei Tita 的解决方案会更聪明。

于 2013-02-15T18:47:55.387 回答