对于以下情况,类型扣除失败.如果我为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;
}
Run Code Online (Sandbox Code Playgroud)
在
template<typename T>
T someFunc(choose_arg_type<T> arg)
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)