C++ C++;11通过推导的类型参数传递成员函数调用?
假设我有一个C++11函数:C++ C++;11通过推导的类型参数传递成员函数调用?,c++,c++11,C++,C++11,假设我有一个C++11函数: template<class F, class... Args> void g(F&& f, Args&&... args) { /* ... */ forward<F>(f)(forward<Args>(args)...); /* ... */ } 是否有某种方法可以通过g将对特定X实例X的调用作为参数f,args传递给h X x = ...; g(x.h); /
template<class F, class... Args>
void g(F&& f, Args&&... args)
{
/* ... */
forward<F>(f)(forward<Args>(args)...);
/* ... */
}
是否有某种方法可以通过g
将对特定X
实例X
的调用作为参数f,args
传递给h
X x = ...;
g(x.h); // WRONG
这会失败,因为x.h
不是一个普通函数,它是一个将This
绑定到&x
的函数
添加缺少的绑定有两种可能:
g([&](){x.h();}); // lambda
g(std::bind(&X::h, std::ref(x))); // std::bind
如果要使用x
的副本调用h
,则将lambda中的[&]
更改为[=]
(同样,删除std::ref
)
lambda可能会快一点。使用
std::mem\u fn
:
X x = ...;
g(mem_fn(&X::h), x);
我会将capture子句更改为
&x
。我认为,这对于x::h
获取任何附加参数都不起作用(至少在没有将std::bind
调用与std::placeholder
的情况下,更不用说lambda版本了),我认为OP希望x
已经被绑定为第一个参数,因此args
要匹配h
的参数。如果不是,那么std::mem\u fn
确实远远优于std::bind
。任何h参数都可以在x:g(mem\u fn(&x::h)、x、arg1、arg2、arg3)之后传递
是的,但是args
与h
的参数并不完全匹配,但是如果这是您想要的,那么您就可以了。等等,我认为ipc的解决方案甚至不适用于带有参数的h
,因此我认为您的解决方案是唯一正确的。g
的args
参数是转发到g
的f
参数的参数,在使用成员函数调用g
的情况下,它们不一定是成员函数的参数。这就是我要说的,如果这对您没有问题,那么std::mem\fn
就可以了。
g([&](){x.h();}); // lambda
g(std::bind(&X::h, std::ref(x))); // std::bind
X x = ...;
g(mem_fn(&X::h), x);