這些模板的實現,我是參考了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

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



81

82

83

84

85

86

87

88

89

90

91



92

93

94

95



96

97



98

99

100

101

102

103

104

105

106

107

108



109

110

111

112



113

114



115

116

117

118

119

120

121

122

123

124

125



126

127

128

129



130

131



132

133

134

135

136

137

138

139

140

141

142



143

144

145

146



147

148



149

150

151

152

153

154

155

156

157

158

159



160

161

162

163



164

165



166

167

168

169

170

171

172

173

174

175



176

177

178

179



180

181



182

183

184

185

186

187

188

189

190

191

192



193

194

195

196



197

198



199

200

201

202

203

204

205

206

207

208



209

210

211

212



213

214



215

216

217

218

219

220

221

222

223

224



225

226

227

228



229

230



231

232

233

234

235

236

237

238

239

240



241

242

243

244



245

246



247

248

249

250

251

252

253

254

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

3



4

5

6

7

8



9

10

11



12

13

14

15

16

17



18

19

20

21

22



23

24

25
