有什么方法可以解决这种类型的扣除?

use*_*078 4 c++ templates

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

Nat*_*ica 5

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)

  • @SergeyA Yakk说他在一些编译器中遇到了问题,但使用`bool`和`true`工作.我喜欢他的建议,因为它强化了我希望`enable_if`的条件为真,这个重载可用.我实际上没有看到`enable_if_t <...>*= nullptr`的问题,但我已经成长为更喜欢这种方式了. (3认同)