2013-02-10 42 views
11

我有一个成员函数与几个参数。我想将它绑定到特定的对象实例并将其传递给另一个函数。我可以用占位符做到这一点:短的方式来std ::绑定成员函数对象实例,没有绑定参数

// actualInstance is a MyClass* 
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3); 

但是,这是一个有点笨拙 - 一,当参数变化的次数,我不得不改变所有的绑定电话也是如此。但是另外,键入所有的占位符是非常繁琐的,当我真正想要的是方便地创建一个包含对象引用的“函数指针”。

所以想什么,我能够做的是一样的东西:

auto callback = objectBind(&MyClass::myFunction, actualInstance); 

有谁知道一些不错的方式做到这一点?

+0

已经有一个建议,让像'绑定(MyClass的:: myFunction的,actualInstance,性病::占位符::全部)'这样做 – 2013-02-10 22:31:37

+0

好 - 你知道它为什么不包含在标准中? – 2013-02-11 10:16:47

+0

因为它只是上个月提出的,所以没有人实现它,更不用说为标准提出它 – 2013-02-11 16:05:22

回答

11

我认为这将工作:

template<typename R, typename C, typename... Args> 
std::function<R(Args...)> objectBind(R (C::* func)(Args...), C& instance) { 
    return [=](Args... args){ return (instance.*func)(args...); }; 
} 

则:

auto callback = objectBind(&MyClass::myFunction, actualInstance); 

记:你需要重载处理CV-合格的成员函数。即:

template<typename R, typename C, typename... Args> 
std::function<R(Args...)> objectBind(R (C::* func)(Args...) const, C const& instance) { 
    return [=](Args... args){ return (instance.*func)(args...); }; 
} 
+1

这里假定'myFunction'没有cv资格,所以需要调整,如果它是 – 2013-02-10 22:34:11

+0

您采取的任何特定原因地址,并做了'(&实例) - > * func'而不是'instance。* func'? – 0x499602D2 2013-02-10 22:37:20

+0

@JonathanWakely除了增加一堆重载之外,还有更好的方法吗? – Pubby 2013-02-10 22:39:42