callback interface

Dev.Write 2013. 9. 20. 16:44 Posted by zetz
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#pragma once
 
// interface
class ICallback
{
public:
    ICallback() {}
    virtual ~ICallback() {}
    virtual void run() = 0;
};
 
// no argument
template<class Func>
class Callback0 : public ICallback
{
public:
    Callback0(Func f) : m_func(f) {}
    virtual void run() { m_func(); }
private:
    Func    m_func;
};
 
// one argument
template<class Func, class Arg0>
class Callback1 : public ICallback
{
public:
    Callback1(Func f, Arg0 a0) : m_func(f), m_arg0(a0) {}
    virtual void run() { m_func(m_arg0); }
private:
    Func    m_func;
    Arg0    m_arg0;
};
 
// member func
template<class Class, class Func>
class CallbackObject0 : public ICallback
{
public:
    CallbackObject0(Class* object, Func func) : m_object(object), m_func(func) {}
    virtual void run() { (m_object->*m_func)(); }
private:
    Class*  m_object;
    Func    m_func;
};
 
template<class Class, class Func, class Arg0>
class CallbackObject1 : public ICallback
{
public:
    CallbackObject1(Class* object, Func func, Arg0 a0) : m_object(object), m_func(func), m_arg0(a0) {}
    virtual void run() { (m_object->*m_func)(m_arg0); }
private:
    Class*  m_object;
    Func    m_func;
    Arg0    m_arg0;
};
 
 
// utility
template<class Ret>
ICallback* MakeCallback(Ret (*func)()) {
    return new Callback0<Ret (*)()>(func);
}
 
template<class Ret, class Arg0>
ICallback* MakeCallback(Ret (*func)(), Arg0 a0) {
    return new Callback1<Ret (*)(Arg0)>(func, a0);
}
 
 
template<class Class, class Ret>
ICallback* MakeCallback(Class* object, Ret (Class::*func)()) {
    return new CallbackObject0<Class, Ret (Class::*)()>(object, func);
}
 
template<class Class, class Ret, class Arg0>
ICallback* MakeCallback(Class* object, Ret (Class::*func)(Arg0), Arg0 a0) {
    return new CallbackObject1<Class, Ret (Class::*)(Arg0), Arg0>(object, func, a0);
}

'Dev.Write' 카테고리의 다른 글

CodePatch  (0) 2013.09.01
a timer using boost  (0) 2013.08.02
boost::xml_parser wrapper  (1) 2013.06.12
list  (0) 2013.04.12
quick sort, bouble sort  (1) 2013.03.25