[英]call member function with expanded tuple parms std::invoke vs std::apply
我发现std::invoke
用一组参数调用每个可调用对象, std::apply
将一个元组作为参数扩展为可调用。
是否有两者的组合能够调用任何可调用的元组作为参数?
#include <iostream>
#include <tuple>
#include <functional>
class A
{
private:
int n;
public:
A( int _n ): n(_n){}
void operator()(int x, double y )
{
std::cout << n << " " << x << " " << y << std::endl;
}
void MemFun( int x, double y )
{
std::cout << n << " " << x << " " << y << std::endl;
}
};
int main()
{
A a(100);
std::invoke( a, 10, 1.23 );
auto parm2 = std::make_tuple( 1,2.34);
std::apply ( a, parm2 );
std::invoke ( &A::MemFun, a, 4, 5.67 );
// ???
std::??apply_invoke?? ( &A::MemFun, a, parm2 );
}
你的意思是这样的吗?
std::apply(&A::MemFun, std::tuple_cat(std::make_tuple(a), parm2));
是否有两者的组合能够调用任何可调用的元组作为参数?
std::apply
可以用来调用任何可调用的,所以我不是真正理解这里的问题。 它就像成员函数的std::invoke
:第一个参数需要是你想要调用函数的对象。 对于std::apply
,其中传递的元组的第一个元素需要是您希望它被调用的对象。
如果你不喜欢指定std::tuple_cat
等,你可以随时创建一个包装器:
template<typename F, typename T, typename U>
decltype(auto) apply_invoke(F&& func, T&& first, U&& tuple) {
return std::apply(std::forward<F>(func), std::tuple_cat(std::forward_as_tuple(std::forward<T>(first)), std::forward<U>(tuple)));
}
怎么样的std::apply( std::bind(&A::MemFun, &a, std::placeholders::_1, std::placeholders::_2), parm2 );
?
编辑包括建议和占位符
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.