【问题标题】:SFINAE function overloadSFINAE 函数重载
【发布时间】:2015-03-11 20:55:50
【问题描述】:

我想问一下使用 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 是整数类型”)。但是,当我为浮点类型添加另一个实例时:

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

我收到错误消息,没有匹配的函数可以调用“function(float)”。这个 sn-p 代码有什么问题?顺便说一句,If 模板类只是 enable_if 的别名。

【问题讨论】:

    标签: c++ templates sfinae


    【解决方案1】:

    好吧,您不能将float 类型的常量用作模板参数。

    尝试class=typename If&lt;IsRead&lt;T&gt;::value,T&gt;::Type 并在另一种情况下与第一遍类似。

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

    【讨论】:

    • 啊,谢谢你,所以在模板参数中附加'*'应该可以解决问题吗?
    • @AlexanderBily 试试看。可能会工作。但是,在使用非类型模板参数时,标准中有一些怪癖,我通常发现最好避免对它们花哨。上次它烧到我涉及到一些关于专业化的事情?我不记得了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多