取自参考参数,为什么调用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';
}
It fails有错误:
[x86-64 gcc 7(快照)]错误:没有匹配的函数可调用
'apply(, std::tuple)' [x86-64 gcc 7 (snapshot)] 注意:无法推导模板
参数“_Fn”
这在 C++17 中并不新鲜。仅从签名来看std::apply
,不知道你是否想通过add_generic<int>
, add_generic<float>
, add_generic<std::string>
,或其他任何东西。知道这一点需要更多的背景信息(具体来说:它需要知道如何std::apply
将调用它),但该信息在调用站点不可用,因此不能用于模板参数推导。
可以通过传递来解决这个问题one对象,并使该对象能够调用任一实例add_generic
需要:
std::cout << std::apply(
[](auto first, auto second) { return add_generic(first, second); },
std::make_tuple(2.0f,3.0f)) << '\n';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)