SFINAE 函数重载

SFINAE function overload

我想问一下使用 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);

它仍然可以正常工作(我收到消息 "T is integral type")。但是,当我为浮点类型添加另一个实例时:

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

我收到错误提示,没有匹配的函数可以调用 "function(float)"。这段代码有什么问题?顺便说一下,If 模板 class 只是 enable_if.

的别名

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

尝试 class=typename If<IsRead<T>::value,T>::Type 并在其他情况下将其作为第一关。

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