有什么办法可以解决这种类型的推论吗?

时间:2019-01-11 15:57:57

标签: c++ templates

在以下情况下类型推导失败。如果我将模板参数指定为someFunc,它将进行编译。我肯定知道这是一个奇怪的情况,但是如果我能使它工作的话,那就太好了。有没有一种替代方法可以在不提供模板参数的情况下进行编译? C ++ 17解决方案很好。

new Vue({
  el: '#app',
  created() {
    console.log("Created");
  }
});

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

否,choose_arg_type<T>在非推论上下文中。已经有很多重复了。

但是,您可以有两个重载,并可以根据类型启用SFINAE。