Maison > développement back-end > C++ > Comment `std::bind` fonctionne-t-il avec les fonctions membres en C ?

Comment `std::bind` fonctionne-t-il avec les fonctions membres en C ?

Barbara Streisand
Libérer: 2024-10-29 21:38:30
original
825 Les gens l'ont consulté

How does `std::bind` work with member functions in C  ?

Comprendre std::bind avec les fonctions membres

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.

Premier argument : un pointeur, pas une référence

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.

Deuxième argument : objet ou pointeur

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.

Implémentation interne

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.

Pourquoi un pointeur vers l'objet ?

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.

Exemple

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal