Here is a better example. I am breaking standards when upcasting a pointer to member though ((void (B::*)(int) -> (void (Object::*)(int))). This is why I never proposed it ;)
#include <list> #include <utility> #include <iostream> using namespace std; struct Object { }; template <typename T> struct signal : list< pair<Object *, T Object::*> > { typedef typename list< pair<Object *, T Object::*> >::value_type value_type; void connect(Object * p, T Object::* s) { push_back(value_type(p, s)); } template <typename U, typename V> void emit(U const & u, V const & v) { for (typename list<value_type>::iterator i = begin(); i != end(); ++ i) { (i->first->*i->second)(u, v); } } template <typename U> void emit(U const & u) { for (typename list<value_type>::iterator i = begin(); i != end(); ++ i) { (i->first->*i->second)(u); } } void emit() { for (typename list<value_type>::iterator i = begin(); i != end(); ++ i) { (i->first->*i->second)(); } } }; // Usage example: struct A : Object { signal<void (int)> sigdone; }; struct B : Object { void slot_bip(int a, ...) { cout << __PRETTY_FUNCTION__ << ": " << a << endl; } void slot_refresh(int a, ...) { cout << __PRETTY_FUNCTION__ << ": " << a << endl; } }; int main() { A a; B b; a.sigdone.connect(& b, (void (Object::*)(int)) & B::slot_bip); a.sigdone.connect(& b, (void (Object::*)(int)) & B::slot_refresh); a.sigdone.emit(99); } Philippe _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost