template class FunctionCall { public: virtual void call(P...par)=0; }; template class FunctionCallT : public FunctionCall { T *o; void (T::*f)(P...); public: FunctionCallT(T &obj, void (T::*fun)(P...)) { o = &obj; f = fun; } void call(P...par) { (o->*f)(par...); } }; template class Signal { map>> cal; public: template void connect(T &o, void (T::*f)(P...)) { cal[&o] = unique_ptr>(new FunctionCallT(o, f)); } void disconnect(void *o) { cal.erase(o); } void operator()(P...par) { for(auto &i : cal) i.second->call(par...); } };