Использование сигнала наддува в boost :: bind - PullRequest
4 голосов
/ 22 сентября 2010

Я пытаюсь обернуть триггер для boost :: signal в boost :: bind объект.Поэтому я хочу вызывать сигнал с некоторыми предварительно упакованными аргументами при вызове boost :: function.

У меня есть следующее:

boost::signals2::signal<void(int)> sig;
boost::function<void()> f = boost::bind(
    &(sig.operator()), &sig, 10);

Но это не такРабота.Я получаю следующую ошибку: ошибка: нет соответствующей функции для вызова привязки (, ...

Я также пробовал это:

boost::function<void()> f = boost::bind(
    (void(boost::signals2::signal<void(int)>::*)(int))
    &(sig.operator()), &sig, 10);

Но тогда я получаю "адрес перегруженной функции снет информации о типе контекста. "

Так какой синтаксис для этого подходит?

1 Ответ

9 голосов
/ 22 сентября 2010

Экземпляр boost :: signal2 :: signal является функциональным объектом (a.k.a. functor) и может быть привязан напрямую, как описано здесь . Единственная проблема в этом случае заключается в том, что сигнал не может быть скопирован, и поэтому его нельзя скопировать в объект, возвращаемый функцией bind. Итак, сначала вы должны обернуть его с наддувом :: ref. Вот пример:

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>

int main(void)
{
  boost::signals2::signal<void(int)> sig;
  boost::function<void()> f = boost::bind(boost::ref(sig), 10);
}
...