|
using | Signal0 = Signal<> |
|
template<typename T > |
using | Signal1 = Signal< T > |
|
template<typename T1 , typename T2 > |
using | Signal2 = Signal< T1, T2 > |
|
template<typename T1 , typename T2 , typename T3 > |
using | Signal3 = Signal< T1, T2, T3 > |
|
template<typename T1 , typename T2 , typename T3 , typename T4 > |
using | Signal4 = Signal< T1, T2, T3, T4 > |
|
template<typename T1 , typename T2 , typename T3 , typename T4 , typename T5 > |
using | Signal5 = Signal< T1, T2, T3, T4, T5 > |
|
using | Slot0 = Slot<> |
|
template<typename T > |
using | Slot1 = Slot< T > |
|
template<typename T1 , typename T2 > |
using | Slot2 = Slot< T1, T2 > |
|
template<typename T1 , typename T2 , typename T3 > |
using | Slot3 = Slot< T1, T2, T3 > |
|
template<typename T1 , typename T2 , typename T3 , typename T4 > |
using | Slot4 = Slot< T1, T2, T3, T4 > |
|
template<typename T1 , typename T2 , typename T3 , typename T4 , typename T5 > |
using | Slot5 = Slot< T1, T2, T3, T4, T5 > |
|
A callback mechanism that isolates event sinks from event sources.
The slot/signal pattern has been used in several C++ libraries including libsigc++, Qt and boost, although it is largely redudant with modern C++. The pattern is completely unrelated to ANSI-C or POSIX signals (signal(), sigaction(2)).
Usage:
struct Source
{
void Source::raiseEvent()
{
m_signal.emit( 123 ) ;
}
} ;
struct Sink
{
void onEvent( int n ) ;
Sink( Source & source ) : m_source(source)
{
}
~Sink()
{
m_source.m_signal.disconnect() ;
}
Source & m_source ;
} ;
Slot< Args... > slot(TSink &sink, void(TSink::*method)(Args...))
A factory function for Slot objects.
For comparison the equivalent modern C++ looks like this:
struct Source
{
std::function<void(int)> m_signal ;
void Source::raiseEvent()
{
if( m_signal ) m_signal( 123 ) ;
}
} ;
struct Sink
{
void onEvent( int n ) ;
Sink( Source & source ) : m_source(source)
{
check( !source.m_signal ) ;
source.m_signal = std::bind_front(&Sink::onEvent,this) ;
}
~Sink()
{
m_source.m_signal = nullptr ;
}
Source & m_source ;
} ;
Slot methods should take parameters by value or const reference but beware of emit()ing references to data members of objects that might get deleted. Use temporaries in the emit() call if in doubt.