青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小議c++之回調

   最近在做一個軍團系統的資料片開發,因為策劃提出了很多遍歷某一軍團當前所有在線玩家的操作(例如發公告、拉人、給獎勵),所以就想到了用回調。
   脫離實際項目代碼,先看一下示例實現:
  1 /**
  2  *\author peakflys 
  3  *\brief C方式實現的C++回調
  4  
*/
  5 #include <iostream>
  6 #include <vector>
  7 
  8 #define COUNTARRAY(a) sizeof(a)/sizeof(a[0])
  9 
 10 class User
 11 {
 12     public:
 13         User(std::string _name,bool _online) : name(_name),online(_online)
 14         {
 15         }
 16         const std::string& getName() const
 17         {
 18             return this->name;
 19         }
 20         bool checkOnLine()
 21         {
 22             return online;
 23         }
 24     private:
 25         std::string name;
 26         bool online;
 27 };
 28 
 29 class Test;
 30 typedef void(Test::*pFun)(const User&);//成員函數
 31 
 32 class Test
 33 {
 34     public:
 35         Test(const std::vector<User>& _userList) : userList(_userList)
 36         {
 37         }
 38 
 39         void print(const User& user);
 40 

 41         void execEvery(pFun fun);
 42 
 43     private:
 44         std::vector<User> userList;
 45 };
 46 
 47 void Test::print(const User& user)
 48 {
 49     std::cout<<user.getName()<<" ";
 50 }
 51 
 52 void Test::execEvery(pFun fun)
 53 {
 54     for(std::vector<User>::iterator it=userList.begin();it!=userList.end();++it)
 55     {
 56         if((*it).checkOnLine())
 57             (this->*fun)(*it); //注意格式
 58     }
 59     std::cout<<std::endl;
 60 }
 61 
 62 int main()
 63 {
 64     User um[] = {User("張三",true),User("李四",false),User("王二",true),User("麻子",true)};
 65     std::vector<User> vu(um,um+COUNTARRAY(um));
 66     Test t(vu);
 67     t.execEvery(&Test::print);
 68     return 0;
 69 }
寫完之后編譯、運行,一切okay,不過后來再看相應代碼時,越看越不順眼,尤其是類似于示例中的第57行:(this->*fun)(*it);  ,感覺使用很暴力,完全沒有OO的優雅感,突然間想到了c++ TR1草案中的function和bind函數(c++11已經將其轉正了)。
   于是重新實現回調功能,示例代碼如下:
  1 /**
  2  *\author peakflys 
  3  *\brief C++方式實現的C++回調
  4  
*/
  5 #include <iostream>
  6 #include <vector>
  7 #include <tr1/functional>
  8 
  9 #define COUNTARRAY(a) sizeof(a)/sizeof(a[0])
 10 
 11 class User
 12 {
 13     public:
 14         User(std::string _name,bool _online) : name(_name),online(_online)
 15         {
 16         }
 17         const std::string& getName() const
 18         {
 19             return this->name;
 20         }
 21         bool checkOnLine()
 22         {
 23             return online;
 24         }
 25     private:
 26         std::string name;
 27         bool online;
 28 };
 29 
 30 class Test
 31 {
 32     public:
 33         Test(const std::vector<User>& _userList) : userList(_userList)
 34         {
 35         }
 36 
 37         void static print(const User& user);
 38 
 39         void execEvery(std::tr1::function<void (const User&)> func);
 40     private:
 41         std::vector<User> userList;
 42 };
 43 
 44 void Test::print(const User& user)
 45 {
 46     std::cout<<user.getName()<<" ";
 47 }
 48 
 49 void Test::execEvery(std::tr1::function<void (const User&)> func)
 50 {
 51     for(std::vector<User>::iterator it=userList.begin();it!=userList.end();++it)
 52     {
 53         if((*it).checkOnLine())
 54             func(*it); //注意格式
 55     }
 56     std::cout<<std::endl;
 57 }
 58 
 59 int main()
 60 {
 61     User um[] = {User("張三",true),User("李四",false),User("王二",true),User("麻子",true)};
 62     std::vector<User> vu(um,um+COUNTARRAY(um));
 63     Test t(vu);
 64     t.execEvery(std::tr1::bind(Test::print,std::tr1::placeholders::_1));
 65     return 0;
 66 }
本文使用的編譯環境是 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46),c++11已經把命名空間std::tr1下的函數賺到了std下。
這樣實現,看起來就好很多了,可讀性也高了不少。新標準擴展的function和bind 功能挺強大的,用它來實現回調和委托還是很方便的。

posted on 2012-08-31 21:38 peakflys 閱讀(2933) 評論(1)  編輯 收藏 引用 所屬分類: C++

評論

# re: 小議c++之回調[未登錄] 2012-09-03 14:10 陳梓瀚(vczh)

只要你用的是VC++2008或者以上,就可以有std::tr1::function或者std::function,請不要浪費時間考慮別的方法,除非你的callback是一個包含多個method的類似template method pattern一樣的callback接口  回復  更多評論   

<2012年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

導航

統計

公告

人不淡定的時候,就愛表現出來,敲代碼如此,偶爾的靈感亦如此……

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            激情综合久久| 亚洲综合视频一区| 午夜亚洲福利在线老司机| 亚洲精品中文字| 亚洲黄色精品| 99re热这里只有精品免费视频| 亚洲激情影院| 中文国产一区| 欧美伊人久久久久久久久影院| 欧美专区一区二区三区| 欧美在线视频一区二区三区| 久久一区激情| 亚洲人在线视频| 一区二区三区视频在线| 午夜精彩视频在线观看不卡| 久久一区视频| 欧美性猛交视频| 国模精品一区二区三区色天香| 永久91嫩草亚洲精品人人| 亚洲精品你懂的| 校园激情久久| 欧美国产综合| 午夜国产不卡在线观看视频| 免费成人黄色| 国产精品日本一区二区| 亚洲国产精品一区二区第一页 | 亚洲精选在线| 午夜精品av| 欧美日韩午夜剧场| 尤妮丝一区二区裸体视频| 亚洲图片在线观看| 亚洲最快最全在线视频| 亚洲欧洲一区二区三区| 亚洲女人天堂av| 亚洲天堂男人| 欧美一区二视频在线免费观看| 久久久久久一区二区| 欧美mv日韩mv亚洲| 欧美日韩免费在线观看| 国产一区二区精品久久91| 午夜精品福利电影| 亚洲另类黄色| 亚洲综合精品自拍| 欧美国产日韩一区二区在线观看| 亚洲精品日韩精品| 国产欧美一区二区精品性色| 国产精品剧情在线亚洲| 久久国产直播| 亚洲国产日韩欧美在线图片| 久久gogo国模啪啪人体图| 欧美成人免费在线观看| 欧美日韩一区二区三区免费看| 亚洲一区久久| 一本一道久久综合狠狠老精东影业 | 亚洲综合三区| 欧美国产日韩视频| 久久久久久久久蜜桃| 国产精品久久久久久五月尺| 国产精品理论片| 99视频热这里只有精品免费| 欧美电影在线免费观看网站| 国产精品盗摄久久久| 久久婷婷蜜乳一本欲蜜臀| 亚洲欧洲一区二区三区| 亚洲国产婷婷香蕉久久久久久| 久久免费的精品国产v∧| 亚洲精品专区| 久久久久成人网| 亚洲天堂av图片| 影音先锋日韩资源| 欧美特黄一级| 亚洲精品一区二区在线| 日韩视频专区| 国产无遮挡一区二区三区毛片日本| 亚洲欧美一区二区三区极速播放| 国产精品影视天天线| 久久免费99精品久久久久久| 在线一区观看| 亚洲国产精品一区| 欧美一区二区在线播放| 日韩午夜在线视频| 国外成人在线| 国产精品永久免费视频| 欧美日韩日本视频| 欧美成人国产va精品日本一级| 欧美一区二区视频在线观看2020| 日韩一级视频免费观看在线| 亚洲丰满在线| 免费亚洲婷婷| 欧美激情按摩在线| 欧美高清在线精品一区| 久久伊人精品天天| 久久免费视频在线| 久久伊人精品天天| 模特精品在线| 亚洲国产精品一区制服丝袜| 欧美国产精品劲爆| 亚洲欧洲在线视频| 99视频有精品| 香蕉久久夜色| 久久综合色88| 国产精品黄色在线观看| 国产精品资源| 欧美黄污视频| 在线一区观看| 久久综合色影院| 国产精品va在线播放| 国产一区二区三区久久精品| 影音先锋在线一区| 亚洲欧美国内爽妇网| 久久婷婷综合激情| 欧美激情一区二区在线 | 在线观看av不卡| 欧美激情aⅴ一区二区三区 | 久久久久**毛片大全| 久久香蕉国产线看观看av| 亚洲午夜在线视频| 麻豆精品在线播放| 久久久91精品国产| 欧美三级网址| 亚洲福利视频免费观看| 国产欧美一区二区精品性| 亚洲精品中文字| 亚洲欧洲在线视频| 久久久久久网| 欧美自拍丝袜亚洲| 国产精品久久二区二区| 亚洲靠逼com| 一本不卡影院| 欧美片网站免费| 亚洲国产成人91精品| 在线观看91精品国产麻豆| 久久精品99国产精品| 欧美在线免费视屏| 国产伦精品一区二区三区四区免费| 一区二区三区视频免费在线观看| aa日韩免费精品视频一| 欧美xart系列高清| 亚洲福利视频一区| 亚洲精品日产精品乱码不卡| 蜜桃av一区| 亚洲精品1区2区| 亚洲一区二区三区中文字幕| 欧美视频二区| 在线中文字幕一区| 欧美一区国产在线| 国内精品伊人久久久久av影院| 久久资源在线| 欧美h视频在线| 国产欧美一区二区三区在线老狼 | 亚洲人被黑人高潮完整版| 午夜精品一区二区三区四区 | 欧美波霸影院| 免费看的黄色欧美网站| 亚洲第一视频网站| 欧美大色视频| 一区二区精品在线| 欧美一区成人| 亚洲大片免费看| 欧美日本一区二区高清播放视频| 一区二区三区福利| 鲁大师成人一区二区三区 | 国产精品久久久久一区二区三区共| 亚洲视频在线观看视频| 另类国产ts人妖高潮视频| 亚洲国产另类久久精品| 欧美日韩成人在线播放| 亚洲综合色婷婷| 欧美护士18xxxxhd| 亚洲欧美视频在线观看| 亚洲成色777777女色窝| 欧美性色aⅴ视频一区日韩精品| 久久国产一区二区| av成人动漫| 欧美第一黄色网| 欧美亚洲日本国产| 亚洲国产精彩中文乱码av在线播放| 欧美日韩调教| 久久中文字幕导航| 亚洲综合色网站| 亚洲精品一级| 欧美 日韩 国产精品免费观看| 亚洲天堂av在线免费观看| 一区在线视频观看| 国产精品美女久久久| 男女精品视频| 久久精品久久综合| 亚洲欧美日韩久久精品| 日韩一区二区免费看| 欧美激情国产日韩精品一区18| 香蕉成人久久| 亚洲视频网站在线观看| 亚洲国产1区| 国产三级精品在线不卡| 欧美日韩亚洲激情| 欧美大片一区二区| 美女图片一区二区| 久久青青草综合| 久久九九电影| 午夜精品久久|