首页 > 解决方案 > 两个版本的 std::enable_if 有什么区别

问题描述

我不明白为什么代码的第一个(好的)版本可以编译,但第二个没有

我读过这个这个这个,当然还有这个,但我仍然不明白为什么一个版本可以编译,而另一个版本不能。如果有人可以请解释一下(比如总傻瓜),我将不胜感激。

版本

template <typename As, typename std::enable_if<
std::is_arithmetic<As>::value, As>::type* = nullptr   > 
As getStringAs(const std::string& arg_name)
{
    std::istringstream istr(arg_name);
    As val;
    istr >> val;
    if (istr.fail())
        throw std::invalid_argument(arg_name);
    return val;
}

版本

template <typename As, typename std::enable_if_t<
std::is_arithmetic<As>::value, As> = 0   > 
As getStringAs(const std::string& arg_name)
{
    std::istringstream istr(arg_name);
    As val;
    istr >> val;
    if (istr.fail())
        throw std::invalid_argument(arg_name);
    return val;
}

预期用途:

int main()
{
   return getStringAs<float>("2.f");
}

非常感谢!

标签: c++c++11templatesc++14

解决方案


std::enable_if_t<std::is_arithmetic<As>::value, As>代替As假设条件为真。发出错误的原因是因为您不能有浮点类型的非类型模板参数。在这种情况下,除了 SFINAE 之外,您似乎没有出于任何原因使用模板参数,因此您可以将第二个替换为Asint应该编译。

std::enable_if_t<std::is_arithmetic<As>::value, int> = 0

推荐阅读