国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例

2020-05-23 14:18:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了C++中關(guān)于委派(Delegates)的實(shí)現(xiàn)示例,針對(duì)C++11的一些新特性進(jìn)行講解,需要的朋友可以參考下

介紹

在 C++ 中通過(guò)一個(gè)全局函數(shù)來(lái)綁定到對(duì)象的成員函數(shù)是很有用的,這個(gè)特性也存在于其他語(yǔ)言中,例如 C#的委派。在 C++ 中相當(dāng)于成員函數(shù)指針,但是 并沒(méi)有提供相應(yīng)的特性。在這篇文章中,我想提出一個(gè)簡(jiǎn)單的 C++ 委派的實(shí)現(xiàn),是用 C++ 成員函數(shù)指針和 C++11 的可變模板(variadic templates),目前這套實(shí)現(xiàn)方法僅支持 GNU C++ 4.7.0,在 Windows 下可使用 MinGW。

背景

在我的方法中獎(jiǎng)提供一個(gè)create_delegate函數(shù),可通過(guò)下面兩種方法來(lái)調(diào)用:

 

 
  1. create_delegate(&object, &member_function) 
  2. create_delegate(&function

第一種方法創(chuàng)建一個(gè)對(duì)象并提供一個(gè)operator()成員函數(shù),第二個(gè)方法生成一個(gè)函數(shù)指針,兩種方法都兼容 type function<...>.

示例程序

首先我們定義一個(gè)包含多個(gè)方法的類:

 

 
  1. class A 
  2. int i; 
  3. public:  
  4. A(int k):i(k) {} 
  5.  
  6. auto get()const ->int { return i;}  
  7. auto set(int v)->void { i = v;} 
  8.  
  9. auto inc(int g)->int& { i+=g; return i;} 
  10. auto incp(int& g)->int& { g+=i; return g;} 
  11.  
  12. auto f5 (int a1, int a2, int a3, int a4, int a5)const ->int 
  13. return i+a1+a2+a3+a4+a5; 
  14.  
  15. auto set_sum4(int &k, int a1, int a2, int a3, int a4)->void 
  16. i+=a1+a2+a3+a4; 
  17. k = i; 
  18.  
  19. auto f8 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) const ->int 
  20. return i+a1+a2+a3+a4+a5+a6+a7+a8; 
  21. }  
  22.  
  23. static auto sqr(double x)->double { return x*x; } 
  24. }; 

請(qǐng)注意你并不需要一定使用 C++ 的 auto 函數(shù)語(yǔ)法,你也可以使用傳統(tǒng)的方法,然后我們使用下面方法創(chuàng)建一個(gè)類:

 

 
  1. A a(11); 

接下來(lái)我們創(chuàng)建委派:

 

 
  1. auto set1 = create_delegate(&a,&A::set); 
  2. auto inc = create_delegate(&a,&A::inc); 
  3. std::function<int(int&)> incp = create_delegate(&a,&A::incp); 
  4. auto af5 = create_delegate(&a,&A::f5); 
  5. auto set_sum4= create_delegate(&a,&A::set_sum4); 
  6. auto af8 = create_delegate(&a,&A::f8); 
  7. auto sqr = create_delegate(&A::sqr); // static function </int(int&)> 
  8.  
  9.  
  10. set1(25); 
  11. int x = 5; 
  12. int k = inc(x); 
  13. k = incp(x); 
  14. std::cout << "a.get():" << a.get() << std::endl; 
  15. std::cout << "k: " << k << std::endl; 
  16. std::cout << "x: " << x << std::endl; 
  17. std::cout << "af5(1,2,3,4,5): " << af5(1,2,3,4,5) << std::endl; 
  18.  
  19. set_sum4(x,1,2,3,20); 
  20. std::cout << "after set_sum4(x,1,2,3,20)" << std::endl; 
  21. std::cout << "a.get(): " << a.get() << std::endl; 
  22. std::cout << "x: " << x << std::endl; 
  23. std::cout << "af8(1,2,3,4,5,6,7,8): " << af8(1,2,3,4,5,6,7,8) << std::endl; 
  24. std::cout << "sqr(2.1): " << sqr(2.1) << std::endl; 

執(zhí)行上述程序的打印結(jié)果如下:

 

 
  1. a.get():30 
  2. k: 35 
  3. x: 35 
  4. af5(1,2,3,4,5): 45 
  5. after set_sum4(x,1,2,3,20) 
  6. a.get(): 56 
  7. x: 56 
  8. af8(1,2,3,4,5,6,7,8): 92 
  9. sqr(2.1): 4.41 

關(guān)鍵點(diǎn)

對(duì)于一個(gè)不是 volatile 和 const 的簡(jiǎn)單函數(shù)而言,實(shí)現(xiàn)是非常簡(jiǎn)單的,我們只需要?jiǎng)?chuàng)建一個(gè)類保存兩個(gè)指針,一個(gè)是對(duì)象,另外一個(gè)是成員函數(shù):

 

 
  1. template <class T, class R, class ... P> 
  2. struct _mem_delegate 
  3. T* m_t; 
  4. R (T::*m_f)(P ...); 
  5. _mem_delegate(T* t, R (T::*f)(P ...) ):m_t(t),m_f(f) {} 
  6. R operator()(P ... p) 
  7. return (m_t->*m_f)(p ...); 
  8. }; 

可變模板 variadic template 允許定義任意個(gè)數(shù)和類型參數(shù)的operator()函數(shù),而create_function 實(shí)現(xiàn)只需簡(jiǎn)單返回該類的對(duì)象:

 

 
  1. template <class T, class R, class ... P> 
  2. _mem_delegate<T,R,P ...> create_delegate(T* t, R (T::*f)(P ...)) 
  3. _mem_delegate<T,R,P ...> d(t,f); 
  4. return d; 

實(shí)際中,我們需要另外的三個(gè)實(shí)現(xiàn)用于覆蓋 const、volatile 和 const volatile 三種成員函數(shù),這也是為什么傳統(tǒng)使用 #define 宏很便捷的原因,讓你無(wú)需重寫代碼段,下面是完整的實(shí)現(xiàn):

 

 
  1. template <class F> 
  2. F* create_delegate(F* f) 
  3. return f; 
  4. #define _MEM_DELEGATES(_Q,_NAME)/ 
  5. template <class T, class R, class ... P>/ 
  6. struct _mem_delegate ## _NAME/ 
  7. {/ 
  8. T* m_t;/ 
  9. R (T::*m_f)(P ...) _Q;/ 
  10. _mem_delegate ## _NAME(T* t, R (T::*f)(P ...) _Q):m_t(t),m_f(f) {}/ 
  11. R operator()(P ... p) _Q/ 
  12. {/ 
  13. return (m_t->*m_f)(p ...);/ 
  14. }/ 
  15. };/ 
  16. template <class T, class R, class ... P>/ 
  17. _mem_delegate ## _NAME<T,R,P ...> create_delegate(T* t, R (T::*f)(P ...) _Q)/ 
  18. {/ 
  19. _mem_delegate ##_NAME<T,R,P ...> d(t,f);/ 
  20. return d;/ 
  21.  
  22. _MEM_DELEGATES(,Z) 
  23. _MEM_DELEGATES(const,X) 
  24. _MEM_DELEGATES(volatile,Y) 
  25. _MEM_DELEGATES(const volatile,W) 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吕梁市| 水城县| 大余县| 本溪市| 宁夏| 宁化县| 德清县| 班玛县| 怀远县| 富民县| 沁水县| 卢湾区| 凌云县| 墨竹工卡县| 江津市| 桓台县| 昌邑市| 合阳县| 河南省| 布尔津县| 城市| 潜山县| 宁安市| 张家口市| 饶平县| 湾仔区| 太仆寺旗| 德格县| 滦南县| 东丽区| 女性| 勐海县| 开远市| 莲花县| 正镶白旗| 西安市| 蕲春县| 苍溪县| 郴州市| 蕲春县| 烟台市|