The code below is a minimal working example of what you requested. ClassA
emits two signals; SigA
sends (and accepts) no parameters, SigB
sends an int
. ClassB
has two functions which will output to cout
when each function is called. In the example there is one instance of ClassA
(a
) and two of ClassB
(b
and b2
). main
is used to connect and fire the signals. It’s worth noting that ClassA
and ClassB
know nothing of each other (ie they’re not compile-time bound).
#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);
}
The output:
Foo Bar: 4 Bar: 4
For brevity I’ve taken some shortcuts that you wouldn’t normally use in production code (in particular access control is lax and you’d normally ‘hide’ your signal registration behind a function like in KeithB’s example).
It seems that most of the difficulty in boost::signal
is in getting used to using boost::bind
. It is a bit mind-bending at first! For a trickier example you could also use bind
to hook up ClassA::SigA
with ClassB::PrintInt
even though SigA
does not emit an int
:
a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));