2012-08-10 107 views
12

我有一個參數數量可變的成員函數,存儲在std::function中,我想綁定實例並獲取獨立的函數對象。以各種各樣的方式綁定成員函數

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    std::function<R(Args...)> = /* bind the instance c into the function? */ 
} 

// ... 

Class c; 
connect(c, &Class::foo); 

有關的參數固定數量我會使用std::bind,但我不明白如何爲可變參數的參數做到這一點。

+0

究竟如何讓'參數數量...'? – Xeo 2012-08-10 13:45:50

+0

好的,我寫了不同的代碼,希望這樣可以更容易理解。 – 2012-08-10 13:48:10

+0

是的。並使解決方案相當簡單。 :) – Xeo 2012-08-10 13:48:58

回答

15

的解決方案是非常簡單,因爲你已經擁有的參數量和一切:

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    // or capture 't' by-value 
    std::function<R(Args...)> fun = [&t,f](Args... args){ f(t,args...); }; 
    // ... 
} 

Live example.

+0

這會在調用堆棧上添加一個額外的圖層,即我必須添加一些'std :: forward'魔術,這樣就沒有副作用,對吧? – 2012-08-10 13:58:31

+4

@lucas:即使聰明的完美轉發魔法也不會神奇地使通過「std :: function」的調用消失。 ;) – Xeo 2012-08-10 14:04:17

+0

:P但不會複製超過需要的東西。 – 2012-08-10 14:31:28