任何解决此类型扣除的方法
Any way to fix this type deduction?
在以下情况下,类型推断失败。如果我将模板参数指定为 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;
}
in
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;
}
不,choose_arg_type<T>
是在非推导的上下文中。已经有很多重复项。
但是,您可以有两个重载,并根据类型启用 SFINAE。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 调用具有未标识类型的类的方法
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 我的模板类方法返回错误类型?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何在没有实例的情况下获取非静态方法的类型?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 使用类型id运算符的最佳替代方法
- 检查子类型时的专用方法模板
- C ++类型特征:确保子类实现方法
- 标识派生类类型的正确方法(类型实体VS dynamic_case)
- 类方法类型的decltype