2017-09-28 62 views
1

只需查詢哪一個是較新版本的C++中更好的選擇來處理成員函數的回調。 任何幫助將不勝感激,希望這個例子也會有所幫助。綁定或Lambda成員函數回調C++ 12

template<class T> 
void addCallBack(void(T::*someFunc)(int), T* instance) { 
    func = std::bind(someFunc, instance, _1); 
} 
std::function<void(int)> func ; 

template<class T> 
void addCallBack(T* instance) { 
    func = [&instance](int x) { 
     instance->someFunc(x); 
    } 
} 
std::function<void(int)> func; 
+0

定義「更好」。 – stark

+2

在表現方面(就我的觀點而言,就清晰度而言),Lambdas幾乎總是優於「綁定」。 – 0x5453

+0

更適合工作,正確的方式,良好的編程習慣等。 我知道在C++中做大多數事情的方法有100種,並且想知道在這種情況下是否存在正確的方法或者它有什麼關係? – user3220058

回答

4

此:

template<class T> 
void addCallBack(T* instance) { 
    func = [&instance](int x) { 
     instance->someFunc(x); 
    } 
} 

被捕獲由參考參數instance,其在addCallBack()末端超出範圍,以便你最終懸空參考。所以,絕對是不是那。

你想要做的是:

func = [instance](int x){ instance->someFunc(x); } 

或者只是:

func = [=](int x){ instance->someFunc(x); } 

現在還不會成爲一個功能上的差異&匕首;這之間

func = std::bind(&T::someFunc, instance, std::placeholders::_1); 

但拉姆達將是通常更易於閱讀(因爲它是在這種情況下),而且更容易內聯,更能夠做到任意複雜的事情。後兩者在這種情況下並不重要 - 但是基本上總是更喜歡lambda表達式的好理由。


&dagger;當然,如果someFunc是一個重載名稱,這是不行的,這是更喜歡lambda的另一個理由 - 它將始終有效。

+0

沒有實際的功能差異,但實際上可以從std函數中謹慎地提取綁定表達式,因爲類型(雖然非常複雜)不能保證像lambda一樣是唯一的。所以不*沒有*功能差異。理智的代碼庫只是沒有實際的區別。 – Yakk