C++ 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); /

假设我有一个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);  // 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);