无法推断模板参数' T'使用std :: conditional

时间:2017-08-23 05:44:59

标签: c++ c++11 templates type-conversion c++14

鉴于这段代码:

#include <type_traits>

template<typename T>
auto sqr(typename std::conditional<sizeof(T) <= sizeof(int), T, const T&>::type a)
{return a*a;}

int main(void)
{
    auto x = sqr<int>(10); //works
    auto y = sqr(10);      //ERROR: couldn't deduce template parameter 'T'
}

调用sqr(10)时导致自动类型扣除失败的原因是什么?有没有办法在没有明确定义类型的情况下调用sqr()

1 个答案:

答案 0 :(得分:2)

这里有一个未受影响的上下文。为了直截了当,请注意::type必须是10的实际类型,但您希望它间接依赖10的类型。因此,参数类型不能用于推导std::conditional的结果。

如果你试图“优化”函数来传递值,那么解决方案就会超载SFINAE。

template<typename T, typename = std::enable_if_t<(sizeof(T) > sizeof(int))>> // base case
auto sqr(const T& a)
{return a*a;}

template<typename T, typename = std::enable_if_t<sizeof(T) <= sizeof(int)>> // more refined case case
auto sqr(T a)
{return a*a;}

或者,为了支持更多条件,您可以使用std::enable_if_t添加SFINAE友好非类型参数。正如@ Jarod42所说:

template<typename T, std::enable_if_t<sizeof(T) <= sizeof(int)> == nullptr>
auto sqr(T a)
{return a*a;}
相关问题