std::bind de fonction membre de classe
J'ai ce code:
#include <iostream>
#include <functional>
struct Foo
{
int get(int n) { return 5+n; }
};
int main()
{
Foo foo;
auto L = std::bind(&Foo::get, &foo, 3);
std::cout << L() << std::endl;
return 0;
}
Semble que cela:
auto L = std::bind(&Foo::get, &foo, 3);
est equivalento:
auto L = std::bind(&Foo::get, foo, 3);
Pourquoi?
Il n'est pas. On se lie à un pointeur, l'autre se lie à un copier.
Pour ce que ça vaut, vous pouvez également passer un pointeur intelligent (tout type qui implémente
dupliquer:stackoverflow.com/questions/15264003/... Bien que j'aime les deux réponses...
Pour ce que ça vaut, vous pouvez également passer un pointeur intelligent (tout type qui implémente
operator->
retour d'un foo*
) comme deuxième argument. Essayez avec un std::shared_ptr
.dupliquer:stackoverflow.com/questions/15264003/... Bien que j'aime les deux réponses...
OriginalL'auteur Gian Lorenzo Meocci | 2013-04-15
Vous devez vous connecter pour publier un commentaire.
std::bind()
accepte ses arguments en valeur. Cela signifie que, dans le premier cas, vous êtes de passage à un pointeur en valeur, résultant dans la copie d'un pointeur. Dans le second cas, vous êtes de passage à un objet de typefoo
en valeur, résultant en une copie d'un objet de typeFoo
.En conséquence, dans le second cas, l'évaluation de l'expression
L()
causes de la fonction de membre deget()
être invoquée sur un copie de l'objet d'originefoo
, qui peut ou peut ne pas être ce que vous voulez.Cet exemple illustre la différence (oubliez la violation de la Règle de Trois, Règle des Cinq, c'est juste à des fins d'illustration):
Live.
Si, pour une raison quelconque, vous ne souhaitez pas utiliser le pointeur de la forme, vous pouvez utiliser
std::ref()
pour prévenir une copie de l'argument d'être créé:OriginalL'auteur Andy Prowl
Ils ne sont pas les mêmes. Le générique de la fonction liant
std::bind
copies c'est des arguments. Dans le cas destd::bind(&Foo::get,&foo,3)
, le pointeur est copié, mais lorsque vous appelez l'objet lié, il s'applique toujours à l'originefoo
objet. Dansstd::bind(&Foo::get,foo,3)
l'objetfoo
est copié, et de l'appeler plus tard s'applique à la limite de la copie, et non pas à l'objet d'origine.Vous pouvez tester cela en utilisant une fonction membre qui accède à l'état interne de l'objet, de lier l'objet dans les deux sens, changement de l'objet d'origine et de voir comment les résultats diffèrent.
OriginalL'auteur David Rodríguez - dribeas