2013-02-10 22 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