我正在尝试执行以下操作,以便从增强信号接收字符串并将其发布到显示器。以下语法不正确。
signal<void (const char*)> UserMessageEvent;
// connect anonymous boost function to display message box on user message event
UserMessageEvent.connect(boost::bind(AfxMessageBox, _1));
如果这是C#,我会做以下操作,让我相信我想使用lambda函数在信号的调用类型和AfxMessageBox参数的类型之间进行转换。但是我不清楚如何做到这一点。
UserMessageEvent += (c) => MessageBox.Show((some const char to LPCSTR conversion)c);
有什么建议吗?
编辑: msvc10给出的错误是错误C2914:'boost :: bind':不能推断模板参数,因为函数参数不明确
答案 0 :(得分:7)
我不知道boost :: bind在默认参数方面的表现如何。
无论如何,这是lambda的语法:
UserMessageEvent.connect( [](const char* message)
{
// maybe need here a conversion to LPCWSTR ?
AfxMessageBox(message);
});
答案 1 :(得分:3)
AfxMessageBox有几个重载和默认参数,这使得你的构造超出了环境。写一个小函数,只取一个LPCSTR,转发到AfxMessageBox,并将其绑定到信号&lt;&gt;。
编辑: 因为有些人似乎不喜欢我上面提供的内容(为什么没有评论而下载?)这里有一些澄清代码,用于我上面写的内容:
int MyMessageBox(LPCSTR msg)
{
return AfxMessageBox(msg);
}
UserMessageEvent.connect(boost::bind(MyMessageBox, _1));
答案 2 :(得分:0)
AfxMessageBox是__stdcall函数,支持在#include之前定义BOOST_BIND_ENABLE_STDCALL的函数:
#define BOOST_BIND_ENABLE_STDCALL
#include <boost\bind.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
boost::bind<int, LPCTSTR>(
&AfxMessageBox, L"", 0, 0);
}