Maison >développement back-end >C++ >Comment stocker correctement les pointeurs de fonction membre dans une carte `std::function` ?

Comment stocker correctement les pointeurs de fonction membre dans une carte `std::function` ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-21 01:00:10549parcourir

How to Correctly Store Member Function Pointers in a `std::function` Map?

Stockage des pointeurs de fonction membre dans std::function Map pour une seule classe

Lors de la tentative de stockage de pointeurs de fonction vers des fonctions membres d'une classe spécifique classe dans une carte std::function, il est crucial de comprendre la nécessité pour une fonction membre non statique d'être appelée avec un object.

Dans le code fourni, l'erreur provient de la signature de fonction incorrecte de std::function. Étant donné que les fonctions membres non statiques passent toujours "this" comme argument implicite, la signature doit être modifiée pour inclure l'objet comme premier paramètre.

L'extrait de code corrigé serait :

#include <functional>

class Foo {
public:
    void doSomething() {}
    void bindFunction() {
        // Correct
        std::function<void(Foo*)> f = &Foo::doSomething;
    }
};

Pour lier davantage une fonction avec des paramètres, des espaces réservés C ou des lambdas C 11 peuvent être utilisés. Voici des exemples de ces approches :

Utilisation d'espaces réservés :

using namespace std::placeholders;
std::function<void(Foo*, int, int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);

Utilisation de Lambdas (C 11) :

std::function<void(Foo*, int, int)> f = [=](Foo* foo, int a, int b) {
    foo->doSomethingArgs(a, b);
};

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