对于以下情况,类型推导失败。如果我为 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 https://en.cppreference.com/w/cpp/language/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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)