任何解决此类型扣除的方法

Any way to fix this type deduction?

本文关键字:方法 类型 解决 任何      更新时间:2023-10-16

在以下情况下,类型推断失败。如果我将模板参数指定为 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。