#include <vector>
#include <iostream>
#include <functional>
template<typename ...Params>
struct Publisher
{
using Signature = void( Params... );
using FunctionType = std::function<Signature>;
std::vector<FunctionType> Subscribers_;
void subscribe( Signature FreeFunc )
{
Subscribers_.emplace_back( FreeFunc );
}
template<typename ObjType>
void subscribe( ObjType* Obj, void (ObjType::*MemFun)( Params... ) )
{
Subscribers_.push_back( std::bind( MemFun, Obj,
std::placeholders::_1 ) );
}
void operator()( Params&&... p )
{
for( const auto& Sub : Subscribers_ )
{
Sub( std::forward<Params>( p )... );
}
}
};
void func1( unsigned int )
{
}
void func2( unsigned int& )
{
}
void func3( const unsigned int& )
{
}
struct Test
{
void func1( unsigned int )
{
}
void func2( unsigned int& )
{
}
void func3( const unsigned int& )
{
}
};
int main()
{
Publisher<unsigned int&> Pub;
// Pub.subscribe( &func1 );
Pub.subscribe( &func2 );
// Pub.subscribe( &func3 );
Test t;
// Pub.subscribe( &t, &Test::func1 );
Pub.subscribe( &t, &Test::func2 );
// Pub.subscribe( &t, &Test::func3 );
unsigned int Arg = 1;
Pub( Arg );
}