【发布时间】:2019-04-25 22:38:02
【问题描述】:
我不明白为什么第一个(good)版本的代码可以编译,但第二个没有
我读过this、this、this,当然还有this,但我仍然不明白为什么一个版本可以编译,而另一个版本不能编译。如果有人能解释一下(比如完全傻瓜),我将不胜感激。
好版
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");
}
非常感谢!
【问题讨论】:
-
std::enable_if_t<cond, T>已经是typename std::enable_if<cond, T>::type。 -
因为你不能有浮点类型的非类型模板参数。
-
@0x499602D2 非常感谢您的回答。现在我知道用谷歌搜索什么了:)
-
@0x499602D2 考虑将其作为答案吗?目前有两个答案,但他们都没有真正回答这个问题。一个是完全错误的,一个只是解释 enable_if 是如何工作的,但没有解释为什么它不能编译。