首页 > 解决方案 > 有什么办法可以解决这种类型的扣除?

问题描述

对于以下情况,类型扣除失败。如果我为 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;
}

标签: c++templates

解决方案


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;
}

推荐阅读