希望想理解C++委托的同学,能够从代码中悟出其中的原理。有什么不太清楚的地方,欢迎留言交流。
1 #include2 using namespace std; 3 4 #define debug(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 5 6 class AF 7 { 8 public: 9 AF() {}10 void Func(int x){11 cout << "AF::Func " << x << endl;12 }13 };14 15 void (AF::*pFunc)(int) = &AF::Func;16 17 int main(int argc, char *argv[])18 {19 AF af;20 (af.*pFunc)(10);21 AF *paf = 22 (paf->*pFunc)(11);23 24 return 0;25 }
1 #include2 using namespace std; 3 4 #define debug(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 5 6 class AF 7 { 8 public: 9 AF() {} 10 void Func(int x){ 11 cout << "AF::Func " << x << endl; 12 } 13 }; 14 15 void (AF::*pFunc)(int) = &AF::Func; 16 17 class BF 18 { 19 public: 20 BF() {} 21 void method(int x){ 22 cout << "BF::method " << x << endl; 23 } 24 }; 25 26 27 /* gcc-4.4.7 不支持特化与偏特化模板 28 template 29 class Test 30 { 31 public: 32 Test( char i, N j ):a( i ), b( j ) 33 { 34 cout<<"模版类偏特化"<< a<< ' ' << b << endl; 35 } 36 private: 37 char a; 38 N b; 39 }; 40 */ 41 42 /* 43 template 44 class DelegateNoneMemFunc 45 { 46 void (*m_pFunc)(int); 47 public: 48 DelegateNoneMemFunc(void (*pFunc)(int) ):m_pFunc(pFunc) {} 49 void invoke(int value){ 50 (*m_pFunc)(value); 51 } 52 }; 53 */ 54 55 56 void NonmemberFunc(int value){ 57 printf("NonmemberFunc: %d\n", value); 58 } 59 60 61 class IDelegateHandler 62 { 63 public: 64 virtual ~IDelegateHandler() {} 65 virtual void invoke(int) = 0; 66 }; 67 68 /* 69 template 70 class DelegateHandlerChild : public IDelegateHandler 71 { 72 public: 73 DelegateHandlerChild() {} 74 void invoke(int value){ 75 printf("DelegateHandlerChild invoke: %d", value); 76 } 77 }; 78 */ 79 80 //* 81 template 82 class DelegateHandler 83 { 84 T *m_pT; 85 void (T::*m_pFunc)(int); 86 public: 87 DelegateHandler(T *pT, void (T::*pFunc)(int)):m_pT(pT), m_pFunc(pFunc) {} 88 89 void invoke(int value){ 90 (m_pT->*m_pFunc)(value); 91 } 92 }; 93 94 template 95 class DelegateNmemHandler 96 { 97 void (*m_pFunc)(int); 98 public: 99 DelegateNmemHandler(void (*pFunc)(int)):m_pFunc(pFunc) {}100 101 void invoke(int value){102 (*m_pFunc)(value);103 }104 };105 106 107 int main(int argc, char *argv[])108 {109 AF af;110 BF bf;111 112 (af.*pFunc)(10);113 AF *paf = 114 (paf->*pFunc)(11);115 116 // template117 DelegateHandler afT(&af, &AF::Func);118 afT.invoke(3);119 120 DelegateHandler bfT(&bf, &BF::method);121 bfT.invoke(4);122 123 // 非成员函数124 DelegateNmemHandler nMemFunc(NonmemberFunc);125 nMemFunc.invoke(5);126 127 return 0;128 }129 130 class LuggageCompartment {131 private:132 int m_iLuggage; //私有变量,保存现在的行李总数133 public:LuggageCompartment() {134 m_iLuggage = 0;135 } //构造函数136 int TakeoutLuggage() //取出一件行李137 {138 if (m_iLuggage != 0)139 m_iLuggage--;140 return m_iLuggage;141 }142 int InsertLuggage() //放入一件行李143 {144 return (++m_iLuggage);145 }146 int checkLuggage() //检查行李总数147 {148 return m_iLuggage;149 }150 };151 152 class FlightSegment {153 private:LuggageCompartment * m_pLC; //成员指针154 public:void SetLuggageCompartment(LuggageCompartment * pLC) {155 m_pLC = pLC;156 } //设置成员指针157 FlightSegment() //构造函数将成员指针初始化为null158 {159 m_pLC = NULL;160 }161 int checkLuggage() {162 if (m_pLC == NULL)163 return -1;164 return m_pLC->checkLuggage(); //将函数调用委托给成员指针165 }166 };
1 #include2 using namespace std; 3 4 #define debug(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 5 6 class AF 7 { 8 public: 9 AF() {} 10 void Func(int x){ 11 cout << "AF::Func " << x << endl; 12 } 13 }; 14 15 void (AF::*pFunc)(int) = &AF::Func; 16 17 class BF 18 { 19 public: 20 BF() {} 21 void method(int x){ 22 cout << "BF::method " << x << endl; 23 } 24 }; 25 26 27 /* gcc-4.4.7 不支持特化与偏特化模板 28 template 29 class Test 30 { 31 public: 32 Test( char i, N j ):a( i ), b( j ) 33 { 34 cout<<"模版类偏特化"<< a<< ' ' << b << endl; 35 } 36 private: 37 char a; 38 N b; 39 }; 40 */ 41 42 void NonmemberFunc(int value){ 43 printf("NonmemberFunc: %d\n", value); 44 } 45 46 47 template 48 class DelegateHandler 49 { 50 T *m_pT; 51 void (T::*m_pFunc)(int); 52 public: 53 DelegateHandler(T *pT, void (T::*pFunc)(int)):m_pT(pT), m_pFunc(pFunc) {} 54 55 void invoke(int value){ 56 (m_pT->*m_pFunc)(value); 57 } 58 }; 59 60 // 非成员函数 61 template 62 class DelegateNmemHandler 63 { 64 void (*m_pFunc)(int); 65 public: 66 DelegateNmemHandler(void (*pFunc)(int)):m_pFunc(pFunc) {} 67 68 void invoke(int value){ 69 (*m_pFunc)(value); 70 } 71 }; 72 73 74 class IDelegateHandler 75 { 76 public: 77 virtual ~IDelegateHandler() {} 78 virtual void invoke(int) = 0; 79 }; 80 81 82 template 83 class DelegateHandlerChild : public IDelegateHandler 84 { 85 T *m_pT; 86 void (T::*m_pFunc)(int); 87 public: 88 DelegateHandlerChild(T *pT, void (T::*pFunc)(int)):m_pT(pT), m_pFunc(pFunc) {} 89 90 void invoke(int value){ 91 (m_pT->*m_pFunc)(value); 92 } 93 }; 94 95 96 template 97 class DelegateNmemHandlerChild : public IDelegateHandler 98 { 99 void (*m_pFunc)(int);100 public:101 DelegateNmemHandlerChild(void (*pFunc)(int)):m_pFunc(pFunc) {}102 103 void invoke(int value){104 (*m_pFunc)(value);105 }106 };107 108 int main(int argc, char *argv[])109 {110 AF af;111 BF bf;112 /*113 (af.*pFunc)(10);114 AF *paf = 115 (paf->*pFunc)(11);116 117 // template118 DelegateHandler afT(&af, &AF::Func);119 afT.invoke(3);120 121 DelegateHandler bfT(&bf, &BF::method);122 bfT.invoke(4);123 124 125 DelegateNmemHandler nMemFunc(NonmemberFunc);126 nMemFunc.invoke(5);127 */128 DelegateHandlerChild ac(&af, &AF::Func);129 DelegateHandlerChild bc(&bf, &BF::method);130 DelegateNmemHandlerChild vc(NonmemberFunc);131 132 vector handler;133 handler.push_back(&ac);134 handler.push_back(&bc);135 handler.push_back(&vc);136 137 for(auto iter = handler.begin(); iter != handler.end(); iter++)138 (*iter)->invoke(8);139 return 0;140 }
1 #include2 using namespace std; 3 4 #define debug(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 5 6 class AF 7 { 8 public: 9 AF() {} 10 void Func(int x){ 11 cout << "AF::Func " << x << endl; 12 } 13 }; 14 15 void (AF::*pFunc)(int) = &AF::Func; 16 17 class BF 18 { 19 public: 20 BF() {} 21 void method(int x){ 22 cout << "BF::method " << x << endl; 23 } 24 }; 25 26 27 /* gcc-4.4.7 不支持特化与偏特化模板 28 template 29 class Test 30 { 31 public: 32 Test( char i, N j ):a( i ), b( j ) 33 { 34 cout<<"模版类偏特化"<< a<< ' ' << b << endl; 35 } 36 private: 37 char a; 38 N b; 39 }; 40 */ 41 42 void NonmemberFunc(int value){ 43 printf("NonmemberFunc: %d\n", value); 44 } 45 46 /* 47 template 48 class DelegateHandler 49 { 50 T *m_pT; 51 void (T::*m_pFunc)(int); 52 public: 53 DelegateHandler(T *pT, void (T::*pFunc)(int)):m_pT(pT), m_pFunc(pFunc) {} 54 55 void invoke(int value){ 56 (m_pT->*m_pFunc)(value); 57 } 58 }; 59 60 // 非成员函数 61 template 62 class DelegateNmemHandler 63 { 64 void (*m_pFunc)(int); 65 public: 66 DelegateNmemHandler(void (*pFunc)(int)):m_pFunc(pFunc) {} 67 68 void invoke(int value){ 69 (*m_pFunc)(value); 70 } 71 }; 72 73 // 多态 74 class IDelegateHandler 75 { 76 public: 77 virtual ~IDelegateHandler() {} 78 virtual void invoke(int) = 0; 79 }; 80 81 82 template 83 class DelegateHandlerChild : public IDelegateHandler 84 { 85 T *m_pT; 86 void (T::*m_pFunc)(int); 87 public: 88 DelegateHandlerChild(T *pT, void (T::*pFunc)(int)):m_pT(pT), m_pFunc(pFunc) {} 89 90 void invoke(int value){ 91 (m_pT->*m_pFunc)(value); 92 } 93 }; 94 95 96 template 97 class DelegateNmemHandlerChild : public IDelegateHandler 98 { 99 void (*m_pFunc)(int);100 public:101 DelegateNmemHandlerChild(void (*pFunc)(int)):m_pFunc(pFunc) {}102 103 void invoke(int value){104 (*m_pFunc)(value);105 }106 };107 108 */109 // 使用宏110 #define DECLARE_PARAMS(...) __VA_ARGS__111 #define DECLARE_ARGS(...) __VA_ARGS__112 113 //0个参数的委托114 #define DELEGATE0(retType, name) \115 DECLARE_DELEGATE(retType, name, DECLARE_PARAMS(void), )116 117 //1个参数的委托118 #define DELEGATE1(retType, name, p1) \119 DECLARE_DELEGATE( \120 retType, \121 name, \122 DECLARE_PARAMS(p1 a), \123 DECLARE_ARGS(a))124 125 //2个参数的委托126 #define DELEGATE2(retType, name, p1, p2) \127 DECLARE_DELEGATE( \128 retType, \129 name, \130 DECLARE_PARAMS(p1 a, p2 b), \131 DECLARE_ARGS(a, b))132 133 //3个参数的委托134 #define DELEGATE3(retType, name, p1, p2, p3) \135 DECLARE_DELEGATE( \136 retType, \137 name, \138 DECLARE_PARAMS(p1 a, p2 b, p3 c), \139 DECLARE_ARGS(a, b, c))140 141 //4个参数的委托142 #define DELEGATE4(retType, name, p1, p2, p3, p4) \143 DECLARE_DELEGATE( \144 retType, \145 name, \146 DECLARE_PARAMS(p1 a, p2 b, p3 c, p4 d), \147 DECLARE_ARGS(a, b, c, d))148 149 //5个参数的委托150 #define DELEGATE5(retType, name, p1, p2, p3, p4, p5) \151 DECLARE_DELEGATE( \152 retType, \153 name, \154 DECLARE_PARAMS(p1 a, p2 b, p3 c, p4 d, p5 e), \155 DECLARE_ARGS(a, b, c, d, e))156 157 //6个参数的委托158 #define DELEGATE6(retType, name, p1, p2, p3, p4, p5, p6) \159 DECLARE_DELEGATE( \160 retType, \161 name, \162 DECLARE_PARAMS(p1 a, p2 b, p3 c, p4 d, p5 e, p6 f), \163 DECLARE_ARGS(a, b, c, d, e, f))164 165 //7个参数的委托166 #define DELEGATE7(retType, name, p1, p2, p3, p4, p5, p6, p7) \167 DECLARE_DELEGATE( \168 retType, \169 name, \170 DECLARE_PARAMS(p1 a, p2 b, p3 c, p4 d, p5 e, p6 f, p7 g), \171 DECLARE_ARGS(a, b, c, d, e, f, g))172 173 //8个参数的委托174 #define DELEGATE8(retType, name, p1, p2, p3, p4, p5, p6, p7, p8) \175 DECLARE_DELEGATE( \176 retType, \177 name, \178 DECLARE_PARAMS(p1 a, p2 b, p3 c, p4 d, p5 e, p6 f, p7 g, p8 h), \179 DECLARE_ARGS(a, b, c, d, e, f, g, h))180 181 182 183 184 #define DECLARE_DELEGATE(retType, name, params, args) \185 class I##name { \186 public: \187 virtual ~I##name() { } \188 virtual retType Invoke(params) = 0; \189 }; \190 template \191 class name : public I##name { \192 public: \193 name(T* pType, retType (T::*pFunc)(params)) \194 : m_pType(pType), m_pFunc(pFunc) { } \195 retType Invoke(params) { \196 return (m_pType->*m_pFunc)(args); \197 } \198 private: \199 T* m_pType; retType (T::*m_pFunc)(params); \200 }; \201 template<> \202 class name : public I##name { \203 public: \204 name(retType (*pFunc)(params)) \205 : m_pFunc(pFunc) { } \206 retType Invoke(params) { \207 return (*m_pFunc)(args); \208 } \209 private: \210 retType (*m_pFunc)(params); \211 }212 213 214 DELEGATE0(void, Test0);215 DELEGATE1(void, Test1, int);216 DELEGATE2(void, Test2, int, int);217 218 void print(){219 printf("Just 0 arg test\n");220 }221 222 int main(int argc, char *argv[])223 {224 AF af;225 BF bf;226 /*227 (af.*pFunc)(10);228 AF *paf = 229 (paf->*pFunc)(11);230 231 // template232 DelegateHandler afT(&af, &AF::Func);233 afT.invoke(3);234 235 DelegateHandler bfT(&bf, &BF::method);236 bfT.invoke(4);237 238 239 DelegateNmemHandler nMemFunc(NonmemberFunc);240 nMemFunc.invoke(5);241 */242 /*243 DelegateHandlerChild ac(&af, &AF::Func);244 DelegateHandlerChild bc(&bf, &BF::method);245 DelegateNmemHandlerChild vc(NonmemberFunc);246 247 vector handler;248 handler.push_back(&ac);249 handler.push_back(&bc);250 handler.push_back(&vc);251 252 for(auto iter = handler.begin(); iter != handler.end(); iter++)253 (*iter)->invoke(8);254 */255 256 Test0 t0(print);257 t0.Invoke();258 259 Test1 test(&af, &AF::Func);260 test.Invoke(5);261 262 Test1 tet(NonmemberFunc);263 tet.Invoke(10);264 265 return 0;266 }