如何设计通用的回调机制
生活随笔
收集整理的這篇文章主要介紹了
如何设计通用的回调机制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如何設計通用的回調機制
許多程序都需要一種通用的回調機制,這種回調機制不用關心它們的類類型。例如,一個調用GUI組件成員函數(shù)的事件驅動的系統(tǒng)中,調用之前并不知道實際的類型信息。這時可以創(chuàng)建一種通用的回調類模板將這種任務流程化。該模板第一個參數(shù)是其成員函數(shù)被調用的類,第二個模板參數(shù)是一個指針,指向類的成員函數(shù)。這里的關鍵技巧第二個參數(shù)基于(或者說依賴于)第一個參數(shù):
template < class T, void (T::*F)() > class callback {/**/};
這個模板的實現(xiàn)并不復雜,有一個對 T 的引用,它是一個類,其成員函數(shù)要被調用,一個構造函數(shù)和一個叫做execute()的成員函數(shù),由它調用回調成員函數(shù):
template < class T, void (T::*F)() >
class callback
{
public:
callback(T& t) : object(t) {} // assign actual object to T
void execute() {(object.*F)();}// launch callback function
private:
T& object;
};
記住:為了通過成員指針調用成員函數(shù),必須要引用或實際對象的指針。這就是為什么該模板有一個T&作為數(shù)據(jù)成員,現(xiàn)在假設我們要使用這個回調模板來執(zhí)行類A 的一個回調函數(shù):
class A
{
public:
void f();
};
這里是實例化該模板的方法:模板參數(shù)必須是常量表達式。因此,你不能用變量作為此成員函數(shù)的地址。而要用&操作符接受該函數(shù)的地址。最后,用模板對象作為參數(shù)傳遞你要調用其成員函數(shù)的對象:
int main()
{
A a; // 首先創(chuàng)建一個對象
callback < A, &A::f > c(a); // 實例化模板
c.execute(); // 調用回調成員函數(shù)
}
你可以將此回調類模板用于任何類類型,只要所調用的成員函數(shù)名字相同即可。
template < class T, void (T::*F)() > class callback {/**/};
這個模板的實現(xiàn)并不復雜,有一個對 T 的引用,它是一個類,其成員函數(shù)要被調用,一個構造函數(shù)和一個叫做execute()的成員函數(shù),由它調用回調成員函數(shù):
template < class T, void (T::*F)() >
class callback
{
public:
callback(T& t) : object(t) {} // assign actual object to T
void execute() {(object.*F)();}// launch callback function
private:
T& object;
};
記住:為了通過成員指針調用成員函數(shù),必須要引用或實際對象的指針。這就是為什么該模板有一個T&作為數(shù)據(jù)成員,現(xiàn)在假設我們要使用這個回調模板來執(zhí)行類A 的一個回調函數(shù):
class A
{
public:
void f();
};
這里是實例化該模板的方法:模板參數(shù)必須是常量表達式。因此,你不能用變量作為此成員函數(shù)的地址。而要用&操作符接受該函數(shù)的地址。最后,用模板對象作為參數(shù)傳遞你要調用其成員函數(shù)的對象:
int main()
{
A a; // 首先創(chuàng)建一個對象
callback < A, &A::f > c(a); // 實例化模板
c.execute(); // 調用回調成員函數(shù)
}
你可以將此回調類模板用于任何類類型,只要所調用的成員函數(shù)名字相同即可。
總結
以上是生活随笔為你收集整理的如何设计通用的回调机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云炬Android开发笔记 7登陆注册
- 下一篇: 新手关于如何看编程经典书的一些疑惑?