Question

Comment puis-je faire cela? (Le code suivant ne fonctionne pas, mais je l'espère, explique l'idée.)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}

Je veux appeler l'appelant en quelque sorte comme:

Caller(ToBeCalled, "stuff")

et ont Caller d'appel ToBeCalled avec tout paramètres il se sent passer les besoins. Si possible, je veux garder tout encapsulé dans la partie privée de ma classe. En réalité, j'aurais 50 fonctions comme ToBeCalled, donc je ne vois pas un moyen d'éviter cela.

Merci pour toutes suggestions. :)

Était-ce utile?

La solution

Vous êtes la plupart du chemin. Vous êtes absent le type de retour de la typedef, il devrait être

typedef int (MyClass::*FuncSig)(int, char*);

Maintenant, il vous suffit de l'utiliser correctement:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

Vous voulez passer autour des instances de FuncSig réelles, pas FuncSig* - un FuncSig* est un pointeur vers un pointeur vers une fonction membre, avec un niveau d'indirection supplémentaire inutile. Vous utilisez alors l'opérateur flèche étoiles (pas son nom officiel) pour l'appeler:

(object_to_be_called_on ->* func)(args);

Pour les objets non-pointeur (par exemple des objets sur la pile, ou des références à des objets), vous utilisez l'opérateur point-étoiles:

MyClass x;
(x .* func)(args);

Aussi, méfiez-vous de la priorité des opérateurs - les opérateurs flèche étoiles et le point-étoiles ont une priorité plus faible que les appels de fonction, vous devez donc mettre entre parenthèses supplémentaires comme je l'ai fait ci-dessus

.

Autres conseils

Je suppose que vous avez essayé Caller(MyClass::ToBeCalled, "stuff") déjà, mais est-il une raison particulière que vous avez besoin d'un pointeur de fonction? En outre, s'il vous plaît poster l'erreur du compilateur réelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top