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
Libérer: 2024-12-21 01:00:10
original
542 Les gens l'ont consulté

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

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

Utilisation de Lambdas (C 11) :

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

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