回調函數是一個很有用,也很重要的概念。當發生某種事件時,系統或其他函數将會自動調用你定義的一段函數。回調函數在windows程式設計使用的場合很多,比如Hook回調函數:MouseProc,GetMsgProc以及EnumWindows,DrawState的回調函數等等,還有很多系統級的回調過程。 一般情況下, 我們使用的回調函數基本都是采用C語言風格. 這裡介紹一種C++風格的回調對象方法. 采用template實作.
[cpp] view plain copy
- template < class Class, typename ReturnType, typename Parameter >
- class SingularCallBack
- {
- public:
- typedef ReturnType (Class::*Method)(Parameter);
- SingularCallBack(Class* _class_instance, Method _method)
- {
- //取得對象執行個體位址,及調用方法位址
- class_instance = _class_instance;
- method = _method;
- };
- ReturnType operator()(Parameter parameter)
- // 調用對象方法
- return (class_instance->*method)(parameter);
- ReturnType execute(Parameter parameter)
- return operator()(parameter);
- private:
- Class* class_instance;
- Method method;
- };
示例:
以下是兩個類實作.
- class A
- void output()
- std::cout << "I am class A :D" << std::endl;
- class B
- bool methodB(A a)
- a.output();
- return true;
- }
SingularCallBack的各種調用示例:
- A a;
- B b;
- SingularCallBack< B,bool,A >* cb;
- cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);
- if((*cb)(a))
- std::cout << "CallBack Fired Successfully!" << std::endl;
- }
- else
- std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
- if(cb->execute(a))
- SingularCallBack< B,bool,A >cb(&b,&B::methodB);
- if(cb(a))
- class AClass
- AClass(unsigned int _id): id(_id){};
- ~AClass(){};
- bool AMethod(std::string str)
- {
- std::cout << "AClass[" << id << "]: " << str << std::endl;
- return true;
- };
- unsigned int id;
- typedef SingularCallBack < AClass, bool, std::string > ACallBack;
- int main()
- std::vector < ACallBack > callback_list;
- AClass a1(1);
- AClass a2(2);
- AClass a3(3);
- callback_list.push_back(ACallBack(&a1, &AClass::AMethod));
- callback_list.push_back(ACallBack(&a2, &AClass::AMethod));
- callback_list.push_back(ACallBack(&a3, &AClass::AMethod));
- for (unsigned int i = 0; i < callback_list.size(); i++)
- {
- callback_list[i]("abc");
- }
- callback_list[i].execute("abc");
- return true;
引用:
C++ Callback Solution
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/force_eagle/article/details/4347329
如:在事件處理線程類中調用未知的類對象的方法,線程對象隻負責運作處理方法時就非常有用了。你可以下載下傳KYLib: http://download.csdn.net/source/1538376,在KYLib類庫中用到非常多的事件方法指針,可以參考學習。
其實就是類方法指針,我覺得你的方法易用性不好,雖然原理正确。
可以看一下我的<如何使用類的成員方法指針?>: http://blog.csdn.net/kyee/archive/2009/03/20/4009735.aspx