Код ниже является минимальным рабочим примером того, что вы просили. ClassA
испускает два сигнала; SigA
отправляет (и принимает) никаких параметров, SigB
отправляет int
. ClassB
имеет две функции, которые будут выводиться на cout
при вызове каждой функции. В примере есть один экземпляр ClassA
(a
) и два экземпляра ClassB
(b
и b2
). main
используется для подключения и запуска сигналов. Стоит отметить, что ClassA
и ClassB
ничего не знают друг о друге (то есть они не связаны во время компиляции ).
#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <iostream>
using namespace boost;
using namespace std;
struct ClassA
{
signal<void ()> SigA;
signal<void (int)> SigB;
};
struct ClassB
{
void PrintFoo() { cout << "Foo" << endl; }
void PrintInt(int i) { cout << "Bar: " << i << endl; }
};
int main()
{
ClassA a;
ClassB b, b2;
a.SigA.connect(bind(&ClassB::PrintFoo, &b));
a.SigB.connect(bind(&ClassB::PrintInt, &b, _1));
a.SigB.connect(bind(&ClassB::PrintInt, &b2, _1));
a.SigA();
a.SigB(4);
}
Выход:
Foo
Bar: 4
Bar: 4
Для краткости я взял несколько ярлыков, которые вы обычно не используете в рабочем коде (в частности, контроль доступа слабый, и вы обычно «скрываете» свою регистрацию сигнала за функцией, как в примере с KeithB).
Кажется, большая часть трудностей в boost::signal
заключается в том, чтобы привыкнуть к использованию boost::bind
. Поначалу это немного ошеломляет! Для более хитрого примера вы также можете использовать bind
, чтобы соединить ClassA::SigA
с ClassB::PrintInt
, хотя SigA
делает не , излучая int
:
a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));
Надеюсь, это поможет!