2017-09-28 9 views
1

Juste pour savoir quel est le meilleur choix dans les nouvelles versions de C++ pour gérer les rappels de fonctions membres. Toute aide serait grandement appréciée, espérons que l'exemple aidera aussi.Lier ou Lambda pour le rappel de la fonction de membre C++ 14

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

ou

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

Définir "mieux". – stark

+2

Les Lambdas sont presque toujours mieux que «bind» en termes de performance (et en termes de clarté, à mon avis). – 0x5453

+0

Plus approprié pour le travail, la bonne manière, la bonne pratique de programmation etc. Je comprends qu'il y a 100 façons de faire la plupart des choses en C++ et que vous voulez savoir s'il y a une façon correcte dans ce cas ou est-ce important? – user3220058

Répondre

4

Ce:

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

capture l'argument instance par référence, qui est hors de portée à la fin de addCallBack() si vous vous retrouvez avec une référence boiteuse . Donc, certainement pas cela.

Qu'est-ce que vous voulez faire est:

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

ou tout simplement:

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

Maintenant, il ne va pas être une différence fonctionnelle & poignard; entre cela et:

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

mais le lambda va être généralement plus facile à lire (comme il est dans ce cas), et plus facile à roues alignées, et est plus capable de faire des choses complexes arbitraires. Les deux derniers n'ont pas d'importance dans ce cas - mais sont de bonnes raisons de toujours préférer toujours lambdas.


& dagger; Bien sûr, cela ne fonctionne pas si someFunc est un nom surchargé, ce qui est une raison de plus de préférer un lambda - qui fonctionnera toujours.

+0

Il n'y a pas de différence fonctionnelle pratique, mais vous pouvez réellement extraire l'expression de liaison avec soin à partir de la fonction std car le type (tout en étant incroyablement complexe) n'est pas garanti unique comme le lambda est. Donc pas * non * différence fonctionnelle. Juste aucune différence pratique dans une base de code saine. – Yakk