繁体   English   中英

无法使用 std::conditional 推导出函数参数的模板参数“T”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM