#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 );
}
