亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中關于委派(Delegates)的實現示例

2020-05-23 14:18:16
字體:
來源:轉載
供稿:網友

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

介紹

在 C++ 中通過一個全局函數來綁定到對象的成員函數是很有用的,這個特性也存在于其他語言中,例如 C#的委派。在 C++ 中相當于成員函數指針,但是 并沒有提供相應的特性。在這篇文章中,我想提出一個簡單的 C++ 委派的實現,是用 C++ 成員函數指針和 C++11 的可變模板(variadic templates),目前這套實現方法僅支持 GNU C++ 4.7.0,在 Windows 下可使用 MinGW。

背景

在我的方法中獎提供一個create_delegate函數,可通過下面兩種方法來調用:

 

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

第一種方法創建一個對象并提供一個operator()成員函數,第二個方法生成一個函數指針,兩種方法都兼容 type function<...>.

示例程序

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

 

 
  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. }; 

請注意你并不需要一定使用 C++ 的 auto 函數語法,你也可以使用傳統的方法,然后我們使用下面方法創建一個類:

 

 
  1. A a(11); 

接下來我們創建委派:

 

 
  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; 

執行上述程序的打印結果如下:

 

 
  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 

關鍵點

對于一個不是 volatile 和 const 的簡單函數而言,實現是非常簡單的,我們只需要創建一個類保存兩個指針,一個是對象,另外一個是成員函數:

 

 
  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 允許定義任意個數和類型參數的operator()函數,而create_function 實現只需簡單返回該類的對象:

 

 
  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; 

實際中,我們需要另外的三個實現用于覆蓋 const、volatile 和 const volatile 三種成員函數,這也是為什么傳統使用 #define 宏很便捷的原因,讓你無需重寫代碼段,下面是完整的實現:

 

 
  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) 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久九九精品99国产精品| 国产精品久久久久久av下载红粉| 国产一区二区三区毛片| 欧美日韩亚洲视频一区| 欧美成人手机在线| 欧美成人精品激情在线观看| 欧美孕妇与黑人孕交| xvideos成人免费中文版| 91免费国产视频| 亚洲精品国产精品久久清纯直播| 成人午夜一级二级三级| 另类少妇人与禽zozz0性伦| 色吧影院999| 成人亚洲激情网| 色诱女教师一区二区三区| 亚洲人成人99网站| 日韩大陆毛片av| 亚洲tv在线观看| 国产在线视频91| 激情成人在线视频| 成人网中文字幕| 91久久久久久久一区二区| 欧美黑人性视频| 成人信息集中地欧美| 2024亚洲男人天堂| 韩剧1988免费观看全集| 国产精品亚洲视频在线观看| 成人春色激情网| 91免费看片网站| 国产精品亚洲激情| 久久精品国产一区二区三区| 国产精品一二三在线| 国产裸体写真av一区二区| 最近2019中文字幕大全第二页| 亚洲精品中文字幕av| 2019精品视频| 97视频网站入口| 国产综合香蕉五月婷在线| 亚洲乱码一区av黑人高潮| 午夜精品一区二区三区av| 久久久久久这里只有精品| 亚洲免费视频一区二区| 国产福利精品av综合导导航| 久久精品国产免费观看| 久久好看免费视频| 国产+人+亚洲| 视频在线观看一区二区| 国内偷自视频区视频综合| 一个人看的www欧美| 日韩av观看网址| 久久亚洲综合国产精品99麻豆精品福利| 欧美激情区在线播放| 精品久久香蕉国产线看观看gif| 欧美性xxxx极品hd欧美风情| 久久天天躁夜夜躁狠狠躁2022| 精品中文字幕久久久久久| 亚洲精品成人久久电影| 亚洲欧美中文日韩v在线观看| 欧美黑人国产人伦爽爽爽| 欧美成人午夜视频| 欧美黑人一区二区三区| 一个色综合导航| 精品呦交小u女在线| 国产精品黄视频| 在线观看欧美www| 久久亚洲综合国产精品99麻豆精品福利| 91性高湖久久久久久久久_久久99| 在线精品国产成人综合| 国产成人一区二区三区电影| 欧美自拍视频在线| 中文国产亚洲喷潮| 日韩美女福利视频| 97欧美精品一区二区三区| 欧美在线激情视频| 欧美午夜片在线免费观看| 成人啪啪免费看| 国产精品美女www爽爽爽视频| 777精品视频| 亚洲国产精品电影在线观看| 2018中文字幕一区二区三区| 亲爱的老师9免费观看全集电视剧| 日韩成人xxxx| 欧美激情视频在线免费观看 欧美视频免费一| 日韩av免费在线看| 亚洲一区二区自拍| 久久视频国产精品免费视频在线| 亚洲精品国产精品国自产在线| 成人中心免费视频| 日本午夜在线亚洲.国产| www.久久久久久.com| 欧美整片在线观看| 欧美做爰性生交视频| 日韩高清免费观看| 欧美特级www| 欧美激情第99页| 成人在线小视频| 成人综合国产精品| 97免费中文视频在线观看| 欧美日韩成人网| 日本一区二三区好的精华液| 国产精品久久久久久久久借妻| 欧美极品少妇xxxxⅹ裸体艺术| 欧美片一区二区三区| 国产在线久久久| 久久人人爽人人爽人人片av高清| 久久理论片午夜琪琪电影网| 成人激情春色网| 久久亚洲精品视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲人午夜色婷婷| 中日韩美女免费视频网址在线观看| 日韩av手机在线| 98精品国产高清在线xxxx天堂| 国产日韩欧美在线| 亚洲最新av在线| 久久夜色精品国产亚洲aⅴ| 91青草视频久久| 富二代精品短视频| 7m精品福利视频导航| 91精品综合久久久久久五月天| 蜜臀久久99精品久久久久久宅男| 久久国产精品免费视频| 97欧美精品一区二区三区| 97超碰国产精品女人人人爽| 国产网站欧美日韩免费精品在线观看| 亚洲老板91色精品久久| 欧美精品久久久久久久久| 97久久精品在线| 福利视频一区二区| 精品国产乱码久久久久久婷婷| 欧美成aaa人片免费看| 欧美乱妇高清无乱码| 最新日韩中文字幕| 亚洲色图第三页| 日韩av影视综合网| 久久福利网址导航| 97av在线视频免费播放| 麻豆国产va免费精品高清在线| 亚洲成年人影院在线| 91精品成人久久| 亚洲精品一区二区三区婷婷月| 日韩精品一区二区视频| 国产精品一香蕉国产线看观看| 国模叶桐国产精品一区| 中文字幕亚洲欧美日韩在线不卡| 亚洲91精品在线| 日韩不卡中文字幕| 青青久久av北条麻妃海外网| 美日韩精品视频免费看| 成人国产精品日本在线| 九九热视频这里只有精品| 欧美视频国产精品| 国产精品男人的天堂| 成人疯狂猛交xxx| 亚洲成人精品在线| 在线播放国产一区中文字幕剧情欧美| 久久国内精品一国内精品| 国产精品久久久久av免费| 国产免费观看久久黄| 精品久久久久久中文字幕一区奶水| 国产999精品| 欧美怡红院视频一区二区三区| 精品一区二区三区四区在线| 欧美人成在线视频|