取自cppreference,为什么对std::apply(add_generic, ...)
的调用无法编译?有办法解决吗?
#include <iostream>
#include <tuple>
int add(int first, int second)
{
return first + second;
}
template<typename T>
T add_generic(T first, T second)
{
return first + second;
}
int main()
{
std::cout << std::apply(add, std::make_tuple(1,2)) << '\n';
// template argument deduction/substitution fails
std::cout << std::apply(add_generic, std::make_tuple(2.0f,3.0f)) << '\n';
}
fails错误:
[x86-64 gcc 7(snapshot)]错误:没有匹配的调用函数 &#39; apply(,std :: tuple)&#39; [x86-64 gcc 7(快照)]注意:无法推断模板 参数&#39; _Fn&#39;
答案 0 :(得分:10)
这在C ++ 17中并不新鲜。仅从std::apply
的签名开始,就无法确定是否要传递add_generic<int>
,add_generic<float>
,add_generic<std::string>
或其他任何内容。知道需要更多上下文(具体来说:它需要知道std::apply
将如何调用它),但该信息在调用站点不可用,因此不能用于模板参数推断。
可以通过传递一个对象来解决这个问题,并使一个对象能够调用add_generic
的任何实例化:
std::cout << std::apply(
[](auto first, auto second) { return add_generic(first, second); },
std::make_tuple(2.0f,3.0f)) << '\n';