Maison > Article > développement back-end > Comment std::bind gère-t-il les fonctions membres et pourquoi une référence d'objet est-elle requise ?
Comment std::bind fonctionne avec les fonctions membres
Lors de l'utilisation de std::bind avec des fonctions de classe membre, plusieurs concepts clés entrent en jeu :
Le premier argument : un pointeur
Dans la syntaxe std::bind(&Foo::print_sum, &foo, 95, _1), le premier argument est pas une référence à un pointeur de fonction, comme on pourrait le supposer. Au lieu de cela, il s'agit d'un pointeur représentant la fonction membre elle-même.
Le deuxième argument : une référence d'objet
Le deuxième argument, dans ce cas &foo , est une référence à un objet de la classe appropriée (Foo). Ceci est nécessaire car une fonction membre nécessite une instance d'objet pour opérer.
Comment std::bind gère les fonctions membres
En interne, std::bind détecte que le le premier argument est un pointeur vers une fonction membre et le convertit en un objet appelable à l'aide de std :: mem_fn. Cet objet appelable conserve le pointeur vers la fonction membre et nécessite une instance d'objet comme premier argument.
Le besoin d'une référence d'objet
Lors de la liaison à une fonction membre , une référence d'objet devient essentielle car la fonction membre est associée à une classe spécifique et nécessite qu'un objet de cette classe soit invoqué. Le deuxième argument de std::bind fournit cette référence d'objet, permettant à la fonction membre d'opérer sur l'objet spécifié.
Exemple
Considérez le code suivant :
<code class="cpp">struct Foo { int value; void f(int n) { std::cout << "f(" << this->value << ", " << n << ")\n"; } }; int main() { Foo foo{10}; auto f_bound = std::bind(&Foo::f, &foo, _1); f_bound(20); // Output: f(10, 20) }</code>
Dans cet exemple, f_bound est un objet appelable qui appelle la fonction membre f sur l'objet foo avec tous les arguments supplémentaires qu'il reçoit. Ainsi, lorsque nous appelons f_bound(20), cela équivaut à appeler foo.f(20), qui affiche "f(10, 20)".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!