[英]Couldn't deduce template parameter 'T' for function arguments using std::conditional
鉴于这段代码:
#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()
?
你在这里有一个未经推断的上下文。 为了直观地说明原因,请注意::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), int*> = nullptr>
auto sqr(T a)
{return a*a;}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.