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