Maison > développement back-end > C++ > Comment utiliser correctement les pointeurs de fonction membre avec std :: function ?

Comment utiliser correctement les pointeurs de fonction membre avec std :: function ?

Mary-Kate Olsen
Libérer: 2024-12-20 13:40:10
original
1080 Les gens l'ont consulté

How to Correctly Use Member Function Pointers with std::function?

Comment gérer les pointeurs de fonction membre dans les objets std::function

Lorsque vous travaillez avec des fonctions membres dans des objets std::function, certaines complications peut survenir. Considérez le code suivant :

#include <functional>

class Foo {
public:
    void doSomething() {}
    void bindFunction() {
        // ERROR
        std::function<void(void)> f = &Foo::doSomething;
    }
};
Copier après la connexion

Une erreur se produit car les fonctions membres non statiques passent implicitement le pointeur "this" comme argument. Cependant, la signature std::function ici ne prend pas en compte cet argument.

Solution : lier les fonctions membres aux objets std::function

Pour résoudre ce problème, le premier argument ("this") doit être explicitement lié :

std::function<void(void)> f = std::bind(&Foo::doSomething, this);
Copier après la connexion

Pour les fonctions avec paramètres, des espaces réservés peuvent être utilisé :

using namespace std::placeholders;
std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);
Copier après la connexion

En C 11, les lambdas peuvent également être utilisés :

std::function<void(int, int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
};
Copier après la connexion

En incorporant ces techniques, les programmeurs peuvent travailler avec succès avec des pointeurs de fonction membres dans les objets std::function, gérer efficacement l'argument implicite "ceci".

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 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