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 gère-t-il les fonctions membres et pourquoi une référence d'objet est-elle requise ?

DDD
DDDoriginal
2024-10-31 23:47:29454parcourir

How does std::bind handle member functions, and why is an object reference required?

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!

Déclaration:
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