Подключение к сигналу Boost Signals2 с анонимной или лямбда-функцией - PullRequest
2 голосов
/ 30 ноября 2010

Я пытаюсь сделать следующее, чтобы получить строку из сигнала повышения и отправить ее на дисплей.Следующий синтаксис неверен.

signal<void (const char*)>                      UserMessageEvent;

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

Если бы это был C #, я бы сделал следующее, заставив меня поверить, что я хочу использовать лямбда-функцию для преобразования между вызывающим типом сигнала и типомАргументы AfxMessageBox.Однако мне не ясно, как это сделать.

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

Любые предложения?

Редактировать: Ошибка, выданная msvc10, является ошибкой C2914: 'boost :: bind': невозможно вывестиАргумент шаблона как аргумент функции неоднозначен

Ответы [ 3 ]

7 голосов
/ 30 ноября 2010

Я не знаю, как boost :: bind ведет себя в отношении параметров по умолчанию.

Во всяком случае, вот синтаксис с лямбда:

UserMessageEvent.connect( [](const char* message)
{
   // maybe need here a conversion to LPCWSTR ?
   AfxMessageBox(message);
});
3 голосов
/ 30 ноября 2010

AfxMessageBox имеет несколько перегрузок и параметров по умолчанию, что делает вашу конструкцию амбициозной. Напишите небольшую функцию, принимающую ровно один LPCSTR, который перенаправляет в AfxMessageBox, и привязывает его к сигналу <>.

EDIT: Поскольку некоторым людям, кажется, не нравится то, что я предоставил выше (почему downvote без комментариев?), Здесь приведен поясняющий код для того, что я написал выше:

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

UserMessageEvent.connect(boost::bind(MyMessageBox, _1));
0 голосов
/ 04 августа 2011

AfxMessageBox - это функция __stdcall, для поддержки таких функций необходимо определить BOOST_BIND_ENABLE_STDCALL перед #include:

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

int _tmain(int argc, _TCHAR* argv[])
  {
  boost::bind<int, LPCTSTR>(
    &AfxMessageBox, L"", 0, 0);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...