回調函數是一個頗有用,也很重要的概念。當發生某種事件時,系統或其餘函數將會自動調用你定義的一段函數。回調函數在windows編程使用的場合不少,好比Hook回調函數:MouseProc,GetMsgProc以及EnumWindows,DrawState的回調函數等等,還有不少系統級的回調過程。 通常狀況下, 咱們使用的回調函數基本都是採用C語言風格. 這裏介紹一種C++風格的回調對象方法. 採用template實現.html
- 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;
-
- };
示例:編程
如下是兩個類實現.windows
- class A
- {
-
- public:
-
- void output()
- {
- std::cout << "I am class A :D" << std::endl;
- };
-
- };
-
- class B
- {
-
- public:
-
- 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;
- }
- A a;
- B b;
-
- SingularCallBack< B,bool,A >* cb;
- cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);
-
- if(cb->execute(a))
- {
- std::cout << "CallBack Fired Successfully!" << std::endl;
- }
- else
- {
- std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
- }
- A a;
- B b;
- SingularCallBack< B,bool,A >cb(&b,&B::methodB);
-
- if(cb(a))
- {
- std::cout << "CallBack Fired Successfully!" << std::endl;
- }
- else
- {
- std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
- }
- class AClass
- {
- public:
-
- AClass(unsigned int _id): id(_id){};
- ~AClass(){};
-
- bool AMethod(std::string str)
- {
- std::cout << "AClass[" << id << "]: " << str << std::endl;
- return true;
- };
-
- private:
-
- 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");
- }
-
- for (unsigned int i = 0; i < callback_list.size(); i++)
- {
- callback_list[i].execute("abc");
- }
-
- return true;
-
- }
引用:post
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