這些模板的實現,我是參考了boost,VCL,及其他人的實現。并按照我的風格和要求,重新做了實現。
示例代碼:
1
#ifndef _X_DELEGATE_H__
2
#define _X_DELEGATE_H__
3
4
#include <xtype.h>
5
namespace zdh
6

{
7
//空事件類型
8
class XNULL_Event
9
{
10
private:
11
XNULL_Event()
{}
12
};
13
//函數類型定義
14
template<class ClassType,
15
class P1 = XNULL_Event, class P2 = XNULL_Event, class P3 = XNULL_Event,
16
class P4 = XNULL_Event, class P5 = XNULL_Event, class P6 = XNULL_Event,
17
class P7 = XNULL_Event, class P8 = XNULL_Event, class P9 = XNULL_Event,
18
class P10 = XNULL_Event>
19
struct SFunctionDefine
20
{
21
typedef void (ClassType::*F0)();
22
typedef void (ClassType::*F1)(P1);
23
typedef void (ClassType::*F2)(P1,P2);
24
typedef void (ClassType::*F3)(P1,P2,P3);
25
typedef void (ClassType::*F4)(P1,P2,P3,P4);
26
typedef void (ClassType::*F5)(P1,P2,P3,P4,P5);
27
typedef void (ClassType::*F6)(P1,P2,P3,P4,P5,P6);
28
typedef void (ClassType::*F7)(P1,P2,P3,P4,P5,P6,P7);
29
typedef void (ClassType::*F8)(P1,P2,P3,P4,P5,P6,P7,P8);
30
typedef void (ClassType::*F9)(P1,P2,P3,P4,P5,P6,P7,P8,P9);
31
typedef void (ClassType::*F10)(P1,P2,P3,P4,P5,P6,P7,P8,P9,P10);
32
};
33
//委托的基類
34
class XDelegateBase
35
{
36
private:
37
//這個結構體的做用是在bind的函數中,將函數指針轉換為void *
38
template<class FunctionPointer>
39
struct SFunctionPointer
40
{
41
FunctionPointer Pointer;
42
};
43
protected:
44
void * m_DelegateObject; /**////<委托的對象
45
void * m_DelegateFunction; ///<委托的函數
46
public:
47
///構造函數
48
XDelegateBase()
49
:m_DelegateFunction(NULL),m_DelegateObject(NULL)
50
{}
51
/**////委托綁定
52
template<class DelegateObjectType,class DelegateFunctionPointer>
53
void Bind(DelegateObjectType * aDelegateObject, DelegateFunctionPointer aDelegateFunction)
54
{
55
SFunctionPointer<DelegateFunctionPointer> FunctionPtr =
{aDelegateFunction };
56
m_DelegateObject = (void *)aDelegateObject;
57
m_DelegateFunction = *(void **)&FunctionPtr;
58
}
59
/**////解除綁定
60
void UnBind()
61
{
62
m_DelegateFunction = NULL;
63
m_DelegateObject = NULL;
64
}
65
/**////判斷是否已經被綁定
66
bool isBinded() const
67
{
68
return m_DelegateFunction != NULL;
69
}
70
};
71
//無參數函數委托類
72
template<class T>
73
class XDelegate0 : public XDelegateBase
74
{
75
public:
76
typedef typename SFunctionDefine<XNULL_Event>::F0 Function;
77
void Invoke()
78
{
79
if( m_DelegateFunction != NULL )
80
{
81
Function Fun;
82
*(void **)&Fun = m_DelegateFunction;
83
(((XNULL_Event *)m_DelegateObject)->*Fun)();
84
}
85
86
}
87
};
88
//一個參數函數委托類
89
template<class P1>
90
class XDelegate1 : public XDelegateBase
91
{
92
public:
93
typedef typename SFunctionDefine<XNULL_Event,P1>::F1 Function;
94
void Invoke(P1 aP1)
95
{
96
if( m_DelegateFunction != NULL )
97
{
98
Function Fun;
99
*(void **)&Fun = m_DelegateFunction;
100
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1);
101
}
102
}
103
};
104
105
//兩個參數函數委托類
106
template<class P1,class P2>
107
class XDelegate2 : public XDelegateBase
108
{
109
public:
110
typedef typename SFunctionDefine<XNULL_Event,P1,P2>::F2 Function;
111
void Invoke(P1 aP1,P2 aP2)
112
{
113
if( m_DelegateFunction != NULL )
114
{
115
Function Fun;
116
*(void **)&Fun = m_DelegateFunction;
117
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2);
118
}
119
}
120
};
121
122
//三個參數函數委托類
123
template<class P1,class P2,class P3>
124
class XDelegate3 : public XDelegateBase
125
{
126
public:
127
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3>::F3 Function;
128
void Invoke(P1 aP1,P2 aP2,P3 aP3)
129
{
130
if( m_DelegateFunction != NULL )
131
{
132
Function Fun;
133
*(void **)&Fun = m_DelegateFunction;
134
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3);
135
}
136
}
137
};
138
139
//四個參數函數委托類
140
template<class P1,class P2,class P3, class P4>
141
class XDelegate4 : public XDelegateBase
142
{
143
public:
144
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4>::F4 Function;
145
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4)
146
{
147
if( m_DelegateFunction != NULL )
148
{
149
Function Fun;
150
*(void **)&Fun = m_DelegateFunction;
151
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3,aP4);
152
}
153
}
154
};
155
156
//五個參數函數委托類
157
template<class P1,class P2,class P3, class P4, class P5>
158
class XDelegate5 : public XDelegateBase
159
{
160
public:
161
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5>::F5 Function;
162
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5)
163
{
164
if( m_DelegateFunction != NULL )
165
{
166
Function Fun;
167
*(void **)&Fun = m_DelegateFunction;
168
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5);
169
}
170
}
171
};
172
//六個參數函數委托類
173
template<class P1,class P2,class P3, class P4, class P5, class P6>
174
class XDelegate6 : public XDelegateBase
175
{
176
public:
177
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6>::F6 Function;
178
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6)
179
{
180
if( m_DelegateFunction != NULL )
181
{
182
Function Fun;
183
*(void **)&Fun = m_DelegateFunction;
184
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6);
185
}
186
}
187
};
188
189
//七個參數函數委托類
190
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7>
191
class XDelegate7 : public XDelegateBase
192
{
193
public:
194
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7>::F7 Function;
195
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7)
196
{
197
if( m_DelegateFunction != NULL )
198
{
199
Function Fun;
200
*(void **)&Fun = m_DelegateFunction;
201
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7);
202
}
203
}
204
};
205
//八個參數函數委托類
206
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8>
207
class XDelegate8 : public XDelegateBase
208
{
209
public:
210
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8>::F8 Function;
211
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8)
212
{
213
if( m_DelegateFunction != NULL )
214
{
215
Function Fun;
216
*(void **)&Fun = m_DelegateFunction;
217
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8);
218
}
219
}
220
};
221
//九個參數函數委托類
222
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8, class P9>
223
class XDelegate9 : public XDelegateBase
224
{
225
public:
226
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8,P9>::F9 Function;
227
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8,P9 aP9)
228
{
229
if( m_DelegateFunction != NULL )
230
{
231
Function Fun;
232
*(void **)&Fun = m_DelegateFunction;
233
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8,aP9);
234
}
235
}
236
};
237
//十個參數函數委托類
238
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8, class P9,class P10>
239
class XDelegate10 : public XDelegateBase
240
{
241
public:
242
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10>::F10 Function;
243
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8,P9 aP9,P10 aP10)
244
{
245
if( m_DelegateFunction != NULL )
246
{
247
Function Fun;
248
*(void **)&Fun = m_DelegateFunction;
249
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8, aP9, aP10);
250
}
251
}
252
};
253
}
254
#endif // _ZY_DELEGATE_H__
255
#ifndef _X_DELEGATE_H__2
#define _X_DELEGATE_H__3

4
#include <xtype.h>5
namespace zdh6


{7
//空事件類型8
class XNULL_Event9

{10
private:11

XNULL_Event()
{}12
};13
//函數類型定義14
template<class ClassType, 15
class P1 = XNULL_Event, class P2 = XNULL_Event, class P3 = XNULL_Event, 16
class P4 = XNULL_Event, class P5 = XNULL_Event, class P6 = XNULL_Event, 17
class P7 = XNULL_Event, class P8 = XNULL_Event, class P9 = XNULL_Event, 18
class P10 = XNULL_Event>19
struct SFunctionDefine20

{21
typedef void (ClassType::*F0)();22
typedef void (ClassType::*F1)(P1);23
typedef void (ClassType::*F2)(P1,P2);24
typedef void (ClassType::*F3)(P1,P2,P3);25
typedef void (ClassType::*F4)(P1,P2,P3,P4);26
typedef void (ClassType::*F5)(P1,P2,P3,P4,P5);27
typedef void (ClassType::*F6)(P1,P2,P3,P4,P5,P6);28
typedef void (ClassType::*F7)(P1,P2,P3,P4,P5,P6,P7);29
typedef void (ClassType::*F8)(P1,P2,P3,P4,P5,P6,P7,P8);30
typedef void (ClassType::*F9)(P1,P2,P3,P4,P5,P6,P7,P8,P9);31
typedef void (ClassType::*F10)(P1,P2,P3,P4,P5,P6,P7,P8,P9,P10);32
};33
//委托的基類34
class XDelegateBase35

{36
private:37
//這個結構體的做用是在bind的函數中,將函數指針轉換為void *38
template<class FunctionPointer>39
struct SFunctionPointer40

{41
FunctionPointer Pointer;42
};43
protected:44

void * m_DelegateObject; /**////<委托的對象45
void * m_DelegateFunction; ///<委托的函數46
public:47
///構造函數48
XDelegateBase()49
:m_DelegateFunction(NULL),m_DelegateObject(NULL)50

{}51

/**////委托綁定52
template<class DelegateObjectType,class DelegateFunctionPointer>53
void Bind(DelegateObjectType * aDelegateObject, DelegateFunctionPointer aDelegateFunction)54

{55

SFunctionPointer<DelegateFunctionPointer> FunctionPtr =
{aDelegateFunction };56
m_DelegateObject = (void *)aDelegateObject;57
m_DelegateFunction = *(void **)&FunctionPtr; 58
}59

/**////解除綁定60
void UnBind() 61

{62
m_DelegateFunction = NULL;63
m_DelegateObject = NULL;64
}65

/**////判斷是否已經被綁定66
bool isBinded() const67

{68
return m_DelegateFunction != NULL;69
}70
};71
//無參數函數委托類72
template<class T>73
class XDelegate0 : public XDelegateBase74

{75
public:76
typedef typename SFunctionDefine<XNULL_Event>::F0 Function;77
void Invoke()78

{79
if( m_DelegateFunction != NULL )80

{81
Function Fun;82
*(void **)&Fun = m_DelegateFunction;83
(((XNULL_Event *)m_DelegateObject)->*Fun)();84
}85

86
}87
};88
//一個參數函數委托類89
template<class P1>90
class XDelegate1 : public XDelegateBase91

{92
public:93
typedef typename SFunctionDefine<XNULL_Event,P1>::F1 Function;94
void Invoke(P1 aP1)95

{96
if( m_DelegateFunction != NULL )97

{98
Function Fun;99
*(void **)&Fun = m_DelegateFunction;100
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1);101
}102
}103
};104

105
//兩個參數函數委托類106
template<class P1,class P2>107
class XDelegate2 : public XDelegateBase108

{109
public:110
typedef typename SFunctionDefine<XNULL_Event,P1,P2>::F2 Function;111
void Invoke(P1 aP1,P2 aP2)112

{113
if( m_DelegateFunction != NULL )114

{115
Function Fun;116
*(void **)&Fun = m_DelegateFunction;117
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2);118
}119
}120
};121

122
//三個參數函數委托類123
template<class P1,class P2,class P3>124
class XDelegate3 : public XDelegateBase125

{126
public:127
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3>::F3 Function;128
void Invoke(P1 aP1,P2 aP2,P3 aP3)129

{130
if( m_DelegateFunction != NULL )131

{132
Function Fun;133
*(void **)&Fun = m_DelegateFunction;134
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3);135
}136
}137
};138

139
//四個參數函數委托類140
template<class P1,class P2,class P3, class P4>141
class XDelegate4 : public XDelegateBase142

{143
public:144
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4>::F4 Function;145
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4)146

{147
if( m_DelegateFunction != NULL )148

{149
Function Fun;150
*(void **)&Fun = m_DelegateFunction;151
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3,aP4);152
}153
}154
};155

156
//五個參數函數委托類157
template<class P1,class P2,class P3, class P4, class P5>158
class XDelegate5 : public XDelegateBase159

{160
public:161
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5>::F5 Function;162
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5)163

{164
if( m_DelegateFunction != NULL )165

{166
Function Fun;167
*(void **)&Fun = m_DelegateFunction;168
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5);169
}170
}171
};172
//六個參數函數委托類173
template<class P1,class P2,class P3, class P4, class P5, class P6>174
class XDelegate6 : public XDelegateBase175

{176
public:177
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6>::F6 Function;178
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6)179

{180
if( m_DelegateFunction != NULL )181

{182
Function Fun;183
*(void **)&Fun = m_DelegateFunction;184
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6);185
}186
}187
};188

189
//七個參數函數委托類190
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7>191
class XDelegate7 : public XDelegateBase192

{193
public:194
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7>::F7 Function;195
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7)196

{197
if( m_DelegateFunction != NULL )198

{199
Function Fun;200
*(void **)&Fun = m_DelegateFunction;201
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7);202
}203
}204
};205
//八個參數函數委托類206
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8>207
class XDelegate8 : public XDelegateBase208

{209
public:210
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8>::F8 Function;211
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8)212

{213
if( m_DelegateFunction != NULL )214

{215
Function Fun;216
*(void **)&Fun = m_DelegateFunction;217
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8);218
}219
}220
};221
//九個參數函數委托類222
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8, class P9>223
class XDelegate9 : public XDelegateBase224

{225
public:226
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8,P9>::F9 Function;227
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8,P9 aP9)228

{229
if( m_DelegateFunction != NULL )230

{231
Function Fun;232
*(void **)&Fun = m_DelegateFunction;233
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8,aP9);234
}235
}236
};237
//十個參數函數委托類238
template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8, class P9,class P10>239
class XDelegate10 : public XDelegateBase240

{241
public:242
typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10>::F10 Function;243
void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8,P9 aP9,P10 aP10)244

{245
if( m_DelegateFunction != NULL )246

{247
Function Fun;248
*(void **)&Fun = m_DelegateFunction;249
(((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8, aP9, aP10);250
}251
}252
};253
}254
#endif // _ZY_DELEGATE_H__255

示例代碼:
1
//未測試的示例代碼
2
class XObject
3

{
4
public:
5
ZY_Delegate0<NULL> EventClick;
6
};
7
class XButton
8

{
9
public:
10
XButton()
11
{
12
EventClick.Bind(this,&XButton::OnClick);
13
}
14
15
private:
16
void OnClick()
17
{
18
printf("hello On Click");
19
}
20
};
21
int main()
22

{
23
XAutoPtr<XObject> p = new XButton();
24
p->EventClick->Invoke();
25
}
//未測試的示例代碼2
class XObject3


{4
public:5
ZY_Delegate0<NULL> EventClick;6
};7
class XButton8


{9
public:10
XButton()11

{12
EventClick.Bind(this,&XButton::OnClick);13
}14

15
private:16
void OnClick()17

{18
printf("hello On Click");19
}20
};21
int main()22


{23
XAutoPtr<XObject> p = new XButton();24
p->EventClick->Invoke();25
}

