上大學(xué)開始接觸編程,一開始便學(xué)習(xí)C++,但是教科書對模板的介紹都比較少,當(dāng)時連比較基礎(chǔ)的C++都學(xué)得一塌糊涂,更不用說模板了。
現(xiàn)在工作任務(wù)完成,有點(diǎn)空閑時間看《C++templates》,看到現(xiàn)在終于能寫點(diǎn)像樣的C++模板了。
目前事件類的封裝還沒有對0--5個參數(shù)模板的特化,這里只貼出具有6個參數(shù)的事件類代碼:
1
#pragma once
2
#include <list>
3
using namespace std;
4
5
//函數(shù)調(diào)用類抽象接口
6
template<typename param1,typename param2,typename param3,typename param4,typename param5,typename param6>
7
class CY_FunctionInterface
8

{
9
public:
10
virtual void* GetClassHandler()=0;
11
virtual void* GetFunHandler()=0;
12
virtual void Invoke(param1 p1,param2 p2,param3 p3,param4 p4,param5 p5,param6 p6)=0;
13
};
14
15
16
//全局函數(shù)調(diào)用類
17
template<typename param1,typename param2,typename param3,typename param4,typename param5,typename param6>
18
class CY_GolobalFunction:public CY_FunctionInterface<param1,param2,param3,param4,param5,param6>
19

{
20
public:
21
typedef void(*T_HANDLER)(param1 ,param2 ,param3 ,param4 ,param5 ,param6);
22
protected:
23
union
24
{
25
T_HANDLER FuncHandler;
26
void* pFPointer;
27
};
28
29
public:
30
CY_GolobalFunction(T_HANDLER f)
31
{
32
FuncHandler=f;
33
}
34
void *GetClassHandler()
35
{
36
return 0;
37
}
38
void *GetFunHandler()
39
{
40
return pFPointer;
41
}
42
void Invoke(param1 p1,param2 p2,param3 p3,param4 p4,param5 p5,param6 p6)
43
{
44
(*FuncHandler)(p1,p2,p3,p4,p5,p6);
45
}
46
};
47
48
//成員函數(shù)調(diào)用類
49
template<typename Class,typename param1,typename param2,typename param3,typename param4,typename param5,typename param6>
50
class CY_MemberFunction:public CY_FunctionInterface<param1,param2,param3,param4,param5,param6>
51

{
52
public:
53
typedef void(Class::*T_HANDLER)(param1,param2,param3,param4,param5,param6);
54
protected:
55
union
56
{
57
T_HANDLER FuncHandler;
58
void * pFPointer;
59
};
60
union
61
{
62
Class *OwnClassHandler;
63
void * pCPointer;
64
};
65
66
public:
67
CY_MemberFunction(Class *pClass,T_HANDLER f)
68
{
69
OwnClassHandler=pClass;
70
FuncHandler=f;
71
}
72
void *GetClassHandler()
73
{
74
return pCPointer;
75
}
76
void *GetFunHandler()
77
{
78
return pFPointer;
79
}
80
void Invoke(param1 p1,param2 p2,param3 p3,param4 p4,param5 p5,param6 p6)
81
{
82
(OwnClassHandler->*FuncHandler)(p1,p2,p3,p4,p5,p6);
83
}
84
};
85
86
87
//事件封裝
88
template<typename param1,typename param2,typename param3,typename param4,typename param5,typename param6>
89
class CY_Event
90

{
91
protected:
92
typedef list< CY_FunctionInterface<param1,param2,param3,param4,param5,param6>*> T_FUNCTIONLIST;
93
typedef typename T_FUNCTIONLIST::iterator T_FUNCTION_ITERATOR;
94
95
T_FUNCTIONLIST FunctionList;
96
97
private:
98
T_FUNCTION_ITERATOR Find(CY_FunctionInterface<param1,param2,param3,param4,param5,param6>* target)
99
{
100
void *temp1=target->GetClassHandler();
101
void *temp2=target->GetFunHandler();
102
T_FUNCTION_ITERATOR i=FunctionList.begin();
103
for (;i!=FunctionList.end();i++)
104
{
105
if (temp1==(*i)->GetClassHandler() && temp2==(*i)->GetFunHandler())
106
{
107
break;
108
}
109
}
110
return i;
111
}
112
public:
113
inline void Invoke(param1 p1,param2 p2,param3 p3,param4 p4,param5 p5,param6 p6)
114
{
115
T_FUNCTION_ITERATOR i=FunctionList.begin();
116
for (;i!=FunctionList.end();i++)
117
{
118
(*i)->Invoke(p1,p2,p3,p4,p5,p6);
119
}
120
}
121
122
void Bind(typename CY_GolobalFunction<param1,param2,param3,param4,param5,param6>::T_HANDLER gFuncHandle)
123
{
124
CY_GolobalFunction<param1,param2,param3,param4,param5,param6>*addone=new CY_GolobalFunction<param1,param2,param3,param4,param5,param6>(gFuncHandle);
125
if(Find(addone)!=FunctionList.end())//已經(jīng)存在了,就不需要添加
126
delete addone;//刪除臨時的new對象
127
else
128
FunctionList.push_back(addone);
129
}
130
void UnBind(typename CY_GolobalFunction<param1,param2,param3,param4,param5,param6>::T_HANDLER gFuncHandle)
131
{
132
CY_GolobalFunction<param1,param2,param3,param4,param5,param6>*delone=new CY_GolobalFunction<param1,param2,param3,param4,param5,param6>(gFuncHandle);
133
T_FUNCTION_ITERATOR delnode=Find(delone);
134
if (delnode!=FunctionList.end())//存在,刪除節(jié)點(diǎn)和指針
135
{
136
delete (*delnode);
137
FunctionList.erase(delnode);
138
}
139
delete delone;//刪除臨時的new對象
140
}
141
template<typename Class>
142
void Bind(Class *classHandle,typename CY_MemberFunction<Class,param1,param2,param3,param4,param5,param6>::T_HANDLER mFuncHandle)
143
{
144
CY_MemberFunction<Class,param1,param2,param3,param4,param5,param6>*addone=new CY_MemberFunction<Class,param1,param2,param3,param4,param5,param6>(classHandle,mFuncHandle);
145
if (Find(addone)!=FunctionList.end())//已經(jīng)存在
146
delete addone;//刪除臨時的new對象
147
else
148
FunctionList.push_back(addone);
149
}
150
template<typename Class>
151
void UnBind(Class *classHandle,typename CY_MemberFunction<Class,param1,param2,param3,param4,param5,param6>::T_HANDLER mFuncHandle)
152
{
153
CY_MemberFunction<Class,param1,param2,param3,param4,param5,param6>*delone=new CY_MemberFunction<Class,param1,param2,param3,param4,param5,param6>(classHandle,mFuncHandle);
154
T_FUNCTION_ITERATOR delnode=Find(delone);
155
if (delnode!=FunctionList.end())//存在,刪除節(jié)點(diǎn)和指針
156
{
157
delete (*delnode);
158
FunctionList.erase(delnode);
159
}
160
delete delone;//刪除臨時的new對象
161
}
162
void operator()(param1 p1,param2 p2,param3 p3,param4 p4,param5 p5,param6 p6)
163
{
164
Invoke(p1,p2,p3,p4,p5,p6);
165
}
166
~CY_Event()
167
{
168
T_FUNCTION_ITERATOR i=FunctionList.begin();
169
for (;i!=FunctionList.end();i++)
170
{
171
delete (*i);
172
}
173
}
174
};

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

測試代碼:
1
#define _CRTDBG_MAP_ALLOC
2
#include<stdlib.h>
3
4
#include<crtdbg.h>
5
6
#include <iostream>
7
#include "Event.h"
8
9
using namespace std;
10
11
class MyClass
12

{
13
public:
14
void func(int a1,int a2,int a3,int a4,int a5,int a6)
15
{
16
cout<<"class func!!"<<endl;
17
cout<<a1<<endl;
18
cout<<a2<<endl;
19
cout<<a3<<endl;
20
cout<<a4<<endl;
21
cout<<a5<<endl;
22
cout<<a6<<endl;
23
cout<<"class func end-----!!"<<endl;
24
}
25
};
26
void gfunc(int a1,int a2,int a3,int a4,int a5,int a6)
27

{
28
cout<<"global func!!"<<endl;
29
cout<<a1<<endl;
30
cout<<a2<<endl;
31
cout<<a3<<endl;
32
cout<<a4<<endl;
33
cout<<a5<<endl;
34
cout<<a6<<endl;
35
cout<<"global func end------!!"<<endl;
36
}
37
38
int main()
39

{
40
MyClass class1;
41
42
CY_Event<int,int,int,int,int,int> *eve;
43
44
eve=new CY_Event<int,int,int,int,int,int>;
45
46
eve->Bind(&gfunc);
47
eve->Bind(&class1,&MyClass::func);
48
49
cout<<"invoking"<<endl;
50
eve->Invoke(1,2,3,4,5,6);
51
eve->UnBind(&class1,&MyClass::func);
52
cout<<"-------------after unBind-------------"<<endl;
53
eve->Invoke(6,5,4,3,2,1);
54
55
delete eve;
56
57
int a;
58
cin>>a;
59
60
_CrtDumpMemoryLeaks();
61
}
運(yùn)行結(jié)果:
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

