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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

C++中的通用Closure

Posted on 2011-04-06 05:01 S.l.e!ep.¢% 閱讀(988) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
在這篇文章里面,我介紹一下如何自己實(shí)現(xiàn)一個(gè)閉包,方便進(jìn)行C++的類函數(shù)回調(diào)。該閉包能夠接受任意類以及類成員做參數(shù)。


* 閉包概念
來源于大名鼎鼎的wikipedia:
In computer science, a closure is a function that is evaluated in an
environment containing one or more bound variables. When called, the function can access these variables.

就是說閉包綁定了一個(gè)函數(shù)以及該函數(shù)調(diào)用發(fā)生需要的所有參數(shù)。當(dāng)閉包被調(diào)用的時(shí)候,相當(dāng)于函數(shù)被調(diào)用,而且可以訪問綁定的參數(shù)。


* 第一步,能接受任意類型的類對(duì)象
這是第一個(gè)實(shí)現(xiàn)
<code>
template<typename T>
class Closure {
? typedef void (T::Func)();
? public:
??? Closure(T* obj, Func f):
????? obj_(obj), f_(f) {
??? }

??? void Run() {
????? (obj_::*f_)();
??? }

?private:
?? T *obj_;
?? Func *f_;
};
</code>

使用起來
<code>
class MyClass {
?public:
? void PrintName() { cout << "MyClass"; }
};

MyClass obj;
Closure<MyClass> closure(obj, &MyClass::PrintName);
closure.Run();
</code>

看起來不錯(cuò),是吧:-)
但是還不能綁定參數(shù)呢。。我們來解決這個(gè)問題,讓他能綁定一個(gè)參數(shù)先。


* 第二步,能綁定一個(gè)任意類型參數(shù)
<code>
template<typename T, typename Arg>
class Closure {
? typedef void (T::Func)(Arg);
? public:
??? Closure(T* obj, Func f, Arg a):
????? obj_(obj), f_(f), a_(a) {
??? }

??? void Run() {
????? (obj_::*f_)(a_);
??? }

?private:
?? T *obj_;
?? Func *f_;
?? Arg a_;
};
</code>

使用方法
<code>
class MyClass {
?public:
? void PrintName(const string& name) { cout << name; }
};

MyClass obj;
Closure<MyClass, string> closure(obj, &MyClass::PrintName, "MyName");
closure.Run();
</code>

哈哈,很好!現(xiàn)在可以綁定參數(shù)羅~~
那怎么可以綁定兩個(gè)參數(shù)呢?嘿嘿,自己想吧~

現(xiàn)在這個(gè)使用方法我覺得很難看,既然調(diào)用方法都是統(tǒng)一的void
Run(),我們應(yīng)該可以讓它使用起來更簡單. 而且如果我要把兩個(gè)不同的
closure傳給某個(gè)函數(shù)就做不到。
比如:
<code>
class MyClass {
?public:
? void PrintName(const string& name) { cout << name; }
};

class MyClass_2 {
?public:
? void PrintValue(int val) { cout << val; }
}

// 這個(gè)函數(shù)怎么寫才能讓兩個(gè)不同的closure都可以傳進(jìn)來?
void func(???* closure) { closure->Run(); }

MyClass obj;
Closure<MyClass, string> closure1(obj, &MyClass::PrintName, "MyName");
MyClass_2 obj2;
Closure<MyClass_2, int> closure2(obj, &MyClass::PrintValue, 11);
closure.Run();
</code>

好吧,干活兒!

* 第三步,使用起來更簡單的Closure
<code>
// 基類;
class Closure {
? public:
??? virtual void Run() = 0;
};

// 實(shí)現(xiàn)支持一個(gè)參數(shù)的Closure;
template<typename T, typename Arg>
class OneArgClosure: public Closure {
? typedef void (T::Func)(Arg);
? public:
??? Closure(T* obj, Func f, Arg a):
????? obj_(obj), f_(f), a_(a) {
??? }

??? virtual void Run() {
????? (obj_::*f_)(a_);
??? }

?private:
?? T *obj_;
?? Func *f_;
?? Arg a_;
};

// 輔助函數(shù)
Template<typename T, typename Arg>
Closure* NewClosure((T* obj, Func f, Arg a) {
? return OneArgClosure(obj, f, a);
}
</code>

使用起來簡單多啦
<code>
class MyClass {
?public:
? void PrintName(const string& name) { cout << name; }
};

MyClass obj;
Closure* closure = NewClosure(obj, &MyClass::PrintName, "MyName");
closure->Run();
delete closure;
</code>

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            黑人一区二区三区四区五区| 欧美另类极品videosbest最新版本 | 国产一区二区三区在线观看免费| 欧美成人一品| 久久久水蜜桃| 亚洲欧美中文日韩v在线观看| 亚洲国产婷婷综合在线精品| 久久久久久久久岛国免费| 亚洲一区国产视频| 99精品视频免费| 在线观看日韩一区| 国产日韩视频一区二区三区| 欧美深夜福利| 欧美精品电影在线| 久久综合九色99| 久久爱91午夜羞羞| 亚洲欧美日韩一区在线观看| 99伊人成综合| 亚洲人永久免费| 亚洲高清一区二| 欧美二区视频| 欧美成年人网| 蜜桃久久精品乱码一区二区| 久久精品视频免费播放| 亚洲欧美在线网| 亚洲综合久久久久| 亚洲男人天堂2024| 午夜精品久久久久| 午夜精品一区二区三区在线| 在线亚洲精品| 亚洲午夜av在线| 亚洲无人区一区| 亚洲视频在线观看| 亚洲欧美日韩视频一区| 亚洲综合精品一区二区| 亚洲欧美日韩在线一区| 小黄鸭视频精品导航| 久久se精品一区二区| 香蕉成人伊视频在线观看| 先锋影音网一区二区| 欧美一二三视频| 久久午夜av| 猛干欧美女孩| 亚洲国产清纯| 一区二区高清| 亚洲欧美日韩中文视频| 亚洲欧美一区二区三区极速播放| 亚洲欧美激情一区二区| 久久精品国产99国产精品| 麻豆av一区二区三区| 欧美精品在线看| 国产精品国码视频| 国内精品久久久久久久影视蜜臀| 在线看国产一区| 亚洲毛片在线观看.| 亚洲无玛一区| 久久精品国产99国产精品| 噜噜噜久久亚洲精品国产品小说| 欧美韩日一区| 一区二区三区视频免费在线观看| 午夜国产精品影院在线观看| 久久噜噜亚洲综合| 欧美人交a欧美精品| 国产农村妇女毛片精品久久麻豆| 精品不卡视频| 中国亚洲黄色| 久久天天躁狠狠躁夜夜爽蜜月 | 伊人久久亚洲热| 亚洲免费成人| 久久精品欧洲| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国内一区二区三区在线视频| 亚洲日本理论电影| 午夜在线成人av| 欧美成人午夜视频| 中文网丁香综合网| 久久久久久国产精品mv| 欧美日韩岛国| 国模 一区 二区 三区| 日韩一级免费| 久久久久久高潮国产精品视| 亚洲人成毛片在线播放| 香蕉精品999视频一区二区| 欧美顶级少妇做爰| 国产欧美另类| 夜夜爽www精品| 老司机午夜精品视频在线观看| 日韩一区二区高清| 久久躁狠狠躁夜夜爽| 欧美午夜免费影院| 亚洲国产另类 国产精品国产免费| 亚洲在线成人| 亚洲激情成人在线| 欧美一区免费| 欧美午夜片在线免费观看| 亚洲黄页视频免费观看| 欧美一站二站| 亚洲三级影院| 久久综合一区| 国产一区二区0| 亚洲欧美日韩精品一区二区| 亚洲国产免费看| 久久久欧美精品sm网站| 国产精品自在线| 亚洲一区成人| 亚洲人屁股眼子交8| 久久久夜夜夜| 韩国久久久久| 久久精品一本久久99精品| 亚洲天堂网站在线观看视频| 欧美日韩国产bt| 亚洲美女一区| 亚洲大片在线| 另类图片综合电影| 激情欧美一区| 久久免费视频这里只有精品| 午夜亚洲精品| 国产欧美日韩综合精品二区| 亚洲影音先锋| 亚洲精品视频在线播放| 欧美成人免费播放| 亚洲激情网站免费观看| 久久亚洲电影| 久久国产精品毛片| 韩国av一区二区三区四区| 久久精品国产亚洲一区二区三区 | 欧美亚洲专区| 亚洲一区二区三区在线视频| 欧美小视频在线| 亚洲一区二区三区免费在线观看| 99av国产精品欲麻豆| 欧美日韩免费一区二区三区视频| 99re热精品| 99re热精品| 国产精品久久久免费| 午夜精彩国产免费不卡不顿大片| 中文亚洲字幕| 国产精一区二区三区| 久久都是精品| 久久久久久电影| 亚洲国产天堂久久综合| 亚洲黄色在线观看| 欧美日韩精品是欧美日韩精品| 在线亚洲精品| 亚洲欧美变态国产另类| 国产在线精品成人一区二区三区| 久久久精品动漫| 久久久久久999| 亚洲精品美女久久久久| 99日韩精品| 国产欧美日韩综合| 久久婷婷综合激情| 欧美**人妖| 亚洲欧美福利一区二区| 欧美一区二区在线视频| 在线日韩精品视频| 亚洲精品一区二区在线观看| 国产精品久久久99| 噜噜噜91成人网| 欧美黄色成人网| 欧美一级播放| 你懂的视频一区二区| 亚洲午夜一区二区三区| 欧美伊人久久| 亚洲精品资源美女情侣酒店| 亚洲一区二区三区国产| 在线成人免费观看| 亚洲精品五月天| 国产日韩欧美在线观看| 亚洲国产精品成人| 亚洲片国产一区一级在线观看| 国产精品多人| 女仆av观看一区| 欧美午夜激情视频| 可以免费看不卡的av网站| 欧美日韩精品一区二区| 久久免费观看视频| 欧美日韩精品免费观看| 久久久久久久综合日本| 欧美看片网站| 久久免费精品日本久久中文字幕| 欧美乱大交xxxxx| 久久久久国色av免费看影院 | 香蕉免费一区二区三区在线观看| 久久精品免费电影| 亚洲小视频在线观看| 久久久久久一区| 亚洲字幕一区二区| 免费成人在线视频网站| 欧美在线观看视频一区二区三区| 猛男gaygay欧美视频| 欧美在线视频全部完| 欧美另类变人与禽xxxxx| 久久久五月天| 国产精品扒开腿爽爽爽视频| 亚洲国产综合在线看不卡| 国产中文一区二区| 亚洲一区三区电影在线观看| 亚洲精选一区| 久久先锋资源|