鉴于这段代码:
#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()
?
答案 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;}