c++ - 有什么办法可以解决这种类型的扣除?
问题描述
对于以下情况,类型扣除失败。如果我为 someFunc 指定模板参数,它就会编译。我肯定看到这是一个奇怪的案例,但如果我能让它工作就好了。有没有另一种方法来制定它可以在不提供模板参数的情况下编译?C++ 17 解决方案很好。
#include <type_traits>
template<typename T>
using choose_arg_type = typename std::conditional<std::is_fundamental<T>::value,T,const T &>::type;
template<typename T>
T someFunc(choose_arg_type<T> arg)
{
return arg + arg;
}
int main()
{
auto result = someFunc(0.0);
return 0;
}
解决方案
在
template<typename T>
T someFunc(choose_arg_type<T> arg)
T
是依赖类型。因此,这里不会发生类型扣除。您可以通过使用SFINAE并针对类型是否为基本类型引入一组重载来解决此问题。那看起来像
template<typename T, std::enable_if_t<std::is_fundamental_v<T>, bool> = true>
T someFunc(T arg)
{
return arg + arg;
}
template<typename T, std::enable_if_t<!std::is_fundamental_v<T>, bool> = true>
T someFunc(const T& arg)
{
return arg + arg;
}
推荐阅读
- angular - 如何在 ngClass 中使用函数?
- drake-r-package - `knitr_out`、`file_out` 和 `vis_drake_graph` 在 R:drake 中的用法
- ruby-on-rails - Rails:从位于单独数据库中的 has_one 关联获取信息
- sql - 使用 DATEDIFF、GETDATE 了解未完成的日子
- c# - 如何在 WPF .NET Core 应用程序中启用控制台?
- jquery - jQuery - 如果 hasClass 设置滚动条的位置
- java - 如何获取 JSON 属性并将其存储在 JAVA 中的数组中?
- javascript - 如何在 Reactjs 中将 props 传递给子组件
- java - 如何在不锁定 UI 线程的情况下在 Android 中等待?
- python - swig 为 c 代码生成 python 包装器 - 来自 numpy.array() 的 IN_ARRAY 和 ARGOUT