std::bind, un outil polyvalent en C, permet de créer des fonctions liées pour une invocation ultérieure. Comprendre son utilisation avec les fonctions membres peut être difficile, mais cette discussion vise à faire la lumière sur les subtilités impliquées.
Lors de la déclaration d'une liaison pour un membre fonction, le premier argument de std::bind n'est pas une référence à la fonction membre mais plutôt un pointeur vers elle. En effet, les fonctions et les données membres se désintègrent en pointeurs lorsqu'ils sont passés en tant qu'arguments.
Le deuxième argument de std::bind lorsqu'il s'agit de fonctions membres spécifie l'objet ou pointeur vers l'objet qui sera utilisé pour appeler la fonction membre. Ceci est nécessaire car les fonctions membres ont un pointeur this implicite qui pointe vers l'objet auquel elles appartiennent.
En interne, std::bind semble créer un objet appelable qui enveloppe le pointeur à la fonction membre. Lors de l'appel de cette fonction liée, l'objet spécifié est utilisé comme pointeur this.
Contrairement aux pointeurs de fonction, qui sont indépendants de tout objet spécifique, les pointeurs de fonction membres sont liés à la classe à laquelle ils appartiennent mais peuvent être utilisés avec n’importe quel objet de cette classe. std::bind prend en charge cela en exigeant un pointeur d'objet comme deuxième argument lorsqu'il s'agit de fonctions membres.
Considérez le code suivant :
<code class="cpp">struct Foo { void print_sum(int n1, int n2) { std::cout << n1 + n2 << '\n'; } }; Foo foo; auto f = std::bind(&Foo::print_sum, &foo, 95, _1);</code>
Dans ce Par exemple, le premier argument de std::bind est &Foo::print_sum, qui est un pointeur vers la fonction membre print_sum dans la classe Foo. Le deuxième argument est &foo, qui est un pointeur vers l'objet foo. Lors de l'appel de f, &foo est utilisé comme pointeur this, permettant à print_sum d'être appelé avec le contexte correct sur l'objet foo.
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!