是否可以强制模板函数只接受某种数字类型的参数?

时间:2013-02-15 18:43:55

标签: c++

例如

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

其中T只能是浮点类型,即float / double / long double

2 个答案:

答案 0 :(得分: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将为falsestd::enable_if<false, T>不提供type typedef,这会导致函数无法编译。

有关这些标准库类的信息,请参阅http://en.cppreference.com/w/cpp/types

答案 1 :(得分: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的解决方案更聪明。