boost::bind & boost::pointeurs de fonction de la surcharge ou de l'basées sur des modèles de fonctions de membre
J'ai un mécanisme de rappel, les classes concernées sont les suivantes:
class App
{
void onEvent(const MyEvent& event);
void onEvent(const MyOtherEvent& event);
Connector connect;
}
class Connector
{
template <class T> void Subscribe(boost::function <void (const T&)> callback);
}
App::App()
{
connect.Subscribe<MyEvent>(&App::OnEvent<MyEvent>);
}
Tout d'abord ce code ne compile pas, c'est une illustration.
L'utilisation de modèles complique mon exemple, mais je l'ai quitté en raison de son incidence sur mon problème. Il me semble certain que mon abonnez-vous doit être basé sur un modèle, car le Connecteur de la classe ne sais pas combien de types d'événements qu'il traite. Lorsque j'essaie de créer un:
boost::function f = &App::OnEvent,
J'ai essayé de créer OnEvent comme un modèle de fonction, avec des spécialisations, mais il semble que le compilateur est le traitement de mon OnEvent fonctions que les surcharges plutôt que de spécialisations de modèle, sinon je obtenir le modèle de spécialisation sont pas dans l'espace de noms d'erreur si j'essaie de le déclarer explicitement comme
template <> OnEvent(const MyEvent& e) ...
Que je peux obtenir à la suite de compilation:
boost::function <void (App*, const MyEvent&)> f = &App::OnEvent;
f(this, e);
Qui compile, des pistes, et des œuvres.
boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this);
ne le fait pas. Je pense que c'est parce que je ne suis pas correctement en précisant l'adresse d'une fonction surchargée.
Après avoir expliqué tout cela à l'ours en peluche - je pense que ma question est "Comment puis-je créer correctement un pointeur de fonction à une surcharge ou basées sur des modèles de fonction de membre et lier le pointeur this?"
OriginalL'auteur swarfrat | 2009-12-16
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez besoin de lever l'ambiguïté de l'adresse de la fonction surchargée. Vous pouvez le faire en faisant explicitement le casting du pointeur de fonction à la une avec les paramètres corrects.
Problème similaire + solution gamedev.net
C'est une honte que vous ne pouvez avoir qu'un seul a accepté de répondre, mais c'était la pièce qui me manquait. Merci pour le lien.
Je suis heureux que j'ai besoin de cette réponse, là encore, maintenant que j'ai assez de réputation à voter!
OriginalL'auteur christopher_f
Vous allez vouloir faire
Vous devriez être en mesure de le faire g(event); avec cette
Je ne suis pas tout à fait sûr de ce que vous essayez d'accomplir ici, mais que doit une solution à vos problèmes pour l'instant.
Que code g(événement), mais il ne sera pas exactement le travail avec des modèles comme je pense que vous voulez. Si vous essayez de faire ce que je pense que vous essayez de faire, vous pourriez être mieux oublier ce modèle et que vous utilisez une interface d'événement de la déclaration de la place. Je serais intéressé de voir comment boost::function serait de travailler avec un basé sur un modèle de définition de fonction, mais je ne pense pas que c'est possible. Vous pourriez vouloir vérifier Boost::Fusion et l'Interprète exemple dans le répertoire lib. Il est le plus avancé Boost::function réalisateur que je connais. libs/function_types/exemple/interprète.php
J'ai enlevé les modèles de la OnEvent côté (s'abonner est toujours basé sur un modèle), et cela fonctionne pour un événement. Mais dès que je surcharge OnEvent, il ne peut plus déduire. Je peux voir pourquoi, en tant que le pointeur de fonction connaît son type, mais boost::bind n'a pas.
OriginalL'auteur Charles