2010-11-30 47 views
2

Je suis en train de faire ce qui suit afin de recevoir une chaîne à partir d'un signal d'impulsion et l'afficher à l'écran. La syntaxe suivante est incorrecte.Connexion pour amplifier le signal Signals2 avec fonction anonyme ou lambda

signal<void (const char*)>      UserMessageEvent; 

// connect anonymous boost function to display message box on user message event 
UserMessageEvent.connect(boost::bind(AfxMessageBox, _1)); 

Si tel était C# je ferais ce qui suit, me porte à croire que je veux utiliser une fonction lambda pour convertir entre le type de signal d'appel et le type des arguments de AfxMessageBox. Cependant, il n'est pas clair pour moi comment faire cela.

UserMessageEvent += (c) => MessageBox.Show((some const char to LPCSTR conversion)c); 

Des suggestions?

Edit: L'erreur donnée par msvc10 est C2914 d'erreur: « boost :: bind »: ne peut pas déduire un argument de modèle comme argument de la fonction est ambiguë

+0

Etes-vous sûr que votre exemple ne fonctionne pas? Je ne vois pas pourquoi il ne serait pas en ce qui concerne le signal boost :: ... – ronag

+0

Je pense qu'il est quelque chose à voir avec les trois paramètres de AfxMessageBox, ou que le const char * à LPCSTR conversion doit être explicite dans certains façon? – Guy

Répondre

7

Je ne sais pas comment stimuler :: bind se comporte par rapport aux paramètres par défaut.

Quoi qu'il en soit, voici la syntaxe avec lambda:

UserMessageEvent.connect([](const char* message) 
{ 
    // maybe need here a conversion to LPCWSTR ? 
    AfxMessageBox(message); 
}); 
+0

Cela fonctionne exactement comme je l'avais prévu. Il s'avère qu'il n'y a pas besoin de convertir depuis le type const char *. La documentation de la fonction boost lambda n'est pas très claire sur ce truc! – Guy

+0

Le boost Signal2 a-t-il déclaré (capturé) lambdas aussi? –

3

AfxMessageBox a plusieurs surcharges et les paramètres par défaut, ce qui rend votre construction au-dessus de mal assurés . Ecrire une petite fonction qui prend exactement un LPCSTR, qui transmet à AfxMessageBox, puis liez au signal <>.

EDIT: Comme certaines personnes semblent ne pas aimer ce que je fournis ci-dessus (pourquoi downvote sans commentaire?) Ici un code précisant ce que j'ai écrit ci-dessus:

int MyMessageBox(LPCSTR msg) 
{ 
    return AfxMessageBox(msg); 
} 

UserMessageEvent.connect(boost::bind(MyMessageBox, _1)); 
+0

Je ne vois pas pourquoi les gens votent dans cette ... – ronag

+0

D'accord, je ne vois pas non plus pourquoi cela a downvoted – Ralf

+0

En ce qui concerne la question posée, c'est la bonne réponse (en raison de surcharges de fonction). 'boost :: bind' ne sait pas quelle version de la surcharge appeler. –

0

AfxMessageBox est __stdcall fonction, pour soutenir ces fonctions, vous devez définir BOOST_BIND_ENABLE_STDCALL avant #include:

#define BOOST_BIND_ENABLE_STDCALL 
#include <boost\bind.hpp> 

int _tmain(int argc, _TCHAR* argv[]) 
    { 
    boost::bind<int, LPCTSTR>(
    &AfxMessageBox, L"", 0, 0); 
    }