fork download
  1. #include <list>
  2. #include <utility>
  3. #include <iostream>
  4.  
  5. #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
  6.  
  7. class Base
  8. {
  9. public:
  10. void doForAllDerived()
  11. {
  12. for (handlerList_t::const_iterator it = _registeredHandlers.begin(); it != _registeredHandlers.end(); ++it )
  13. {
  14. PrepFn pFn = (*it);
  15. CALL_MEMBER_FN(*this, pFn )( 5 );
  16. }
  17. }
  18.  
  19. protected:
  20. typedef void (Base::*PrepFn)( int n );
  21.  
  22. void registerPrepFn( PrepFn fn )
  23. {
  24. _registeredHandlers.push_back( fn );
  25. };
  26.  
  27. private:
  28. typedef std::list< PrepFn > handlerList_t;
  29. handlerList_t _registeredHandlers;
  30. };
  31.  
  32. class Derived : public Base
  33. {
  34. public:
  35. Derived(int m) : _m(m) {
  36. registerPrepFn( static_cast<PrepFn>(&Derived::derivedPrepFn) );
  37. };
  38.  
  39. protected:
  40. void derivedPrepFn( int n )
  41. {
  42. std::cout << _m << ", " << n << std::endl;
  43. };
  44.  
  45. int _m;
  46. };
  47.  
  48. int main() {
  49. Derived anInstance(20);
  50. anInstance.doForAllDerived();
  51. }
  52.  
Success #stdin #stdout 0.02s 2856KB
stdin
Standard input is empty
stdout
20, 5