SFINAE功能过载

时间:2015-03-11 20:55:51

标签: c++ templates sfinae

我想问一下使用SFINAE的函数重载。我定义了2个函数,其中一个函数应该在整数类型作为参数传递时使用,另一个函数应该在浮点作为参数传递时使用。这是代码:

template <typename T, typename If<IsIntegral<T>::value,T>::Type = 0>
void function(T t) {
    std::cout << "T is integral type" << std::endl;
}
template <typename T, typename If<IsReal<T>::value,T>::Type = 0>
void function(T t) {
    std::cout << "T is real type" << std::endl;
}

编译好。当我实例化函数的积分版本时,如:

function(4);
function(28l);

它仍然可以正常工作(我收到消息&#34; T是整数类型&#34;)。但是,当我为浮点类型添加另一个实例时:

function(4);
function(28l);
function(4.5f);

我得到错误说,没有匹配的函数可以调用&#34; function(float)&#34;。这段代码有什么问题?顺便说一下,If模板类只是enable_if的别名。

1 个答案:

答案 0 :(得分:3)

嗯,您不能将float类型的常量作为模板参数。

尝试class=typename If<IsRead<T>::value,T>::Type和其他情况下的类似作为第一次传递。

如果您使用的是C ++ 11,请尝试使用using别名来清除typename垃圾邮件。此外,在发布问题寻求帮助时,请更喜欢std::enable_if<?>If<?>,因为我必须猜测 If做了什么(而且据我所知,你真实的问题在于IfIsReal等的实施。