使用匿名或lambda函数连接到Boost Signals2信号

时间:2010-11-30 12:29:30

标签: c++ events boost signals

我正在尝试执行以下操作,以便从增强信号接收字符串并将其发布到显示器。以下语法不正确。

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':不能推断模板参数,因为函数参数不明确

3 个答案:

答案 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);
  }