202 votes

Utilisation d'objets std :: function génériques avec des fonctions membres dans une classe

Pour une classe, je veux stocker des pointeurs de fonction pour les fonctions de membres de la même classe dans une map stocker std::function objets. Mais je n'arrive pas dès le début avec ce code:

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

Je reçois error C2064: term does not evaluate to a function taking 0 arguments en xxcallobj combiné avec d'étranges instanciation d'un modèle d'erreurs. Actuellement je travaille sur Windows 8 avec Visual Studio 2010/2011 et sur Win 7 avec VS10 il échoue également. L'erreur doit être basée sur certains bizarre C++ règles je ne les suivez pas.

EDIT: je ne PAS utiliser boost. C'est le C++11 intégrés dans la MS du compilateur.

341voto

Alex B Points 34304

Un non-membre statique de la fonction doit être appelée avec un objet. Qui est, il toujours implicitement passe pointeur "this" comme argument.

Parce que votre std::function signature spécifie que la fonction ne prend aucun argument (<void(void)>), vous devez lier le premier (et le seul) argument.

std::function<void(void)> f = std::bind(&Foo:doSomething, this);

Si vous voulez lier une fonction avec des paramètres, vous devez spécifier des espaces réservés:

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

Ou, si votre compilateur prend en charge le C++11 lambdas:

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

(Je n'ai pas de C++11 capable compilateur à la main droite maintenant, donc je ne peux pas vérifier celui-ci.)

94voto

Armen Tsirunyan Points 59548

Soit vous avez besoin

 std::function<void(Foo*)> f = &Foo:doSomething;
 

afin que vous puissiez l'appeler sur n'importe quelle instance ou que vous deviez lier une instance spécifique, par exemple this

 std::function<void(void)> f = std::bind(&Foo:doSomething, this);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X