c++ - 两个版本的 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");
}
非常感谢!
解决方案
std::enable_if_t<std::is_arithmetic<As>::value, As>
代替As
假设条件为真。发出错误的原因是因为您不能有浮点类型的非类型模板参数。在这种情况下,除了 SFINAE 之外,您似乎没有出于任何原因使用模板参数,因此您可以将第二个替换为As
它int
应该编译。
std::enable_if_t<std::is_arithmetic<As>::value, int> = 0
推荐阅读
- php - 无法访问整数变量的属性
- python - 带有大表的 Dash plotly 仪表板
- c++ - 服务器关闭永远不会完成
- javascript - Webpack 5 开发服务器不提供 CSS
- html - 如何使用来自不同文件夹的 Angular 组件?
- docker - 如何为 docker compose run 指定 docker compose 文件?
- delphi - 在地图视图中将文本添加到标记?
- c++ - Qt Installer Framework:如何仅更新已更改的文件?
- javascript - 如何解析包含标签的字符串?
- angular - Angular 11 mat 输入在删除内容时显示 [object HTMLInputElement]