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

cyt
發現原來已經有兩個多月沒有寫blog了。近來工作都很忙,回到家都懶懶的不想動。雖然工作上做了很多有趣的東西,但畢竟有版權保護,在公司做的工作不能直接寫在blog上,也要抽些時間整理一下才能放上來。
??? 今天在 www.codeproject.com 上又發現比較好玩的東西:http://www.codeproject.com/cpp/acfdelegate.asp
或者去 http://acfproj.sourceforge.net/.

??? 作者甚是好耐心開發了一套和C#用法差不多的C++庫。當然這里只是著重討論他的Delegate實現。其實Delegate也不是什么新技術,正如下文有人提出的boost.singal (http://www.boost.org/doc/html/signals.html)、另外還有:

Delegate - Extended Callback Library????http://callbackext.berlios.de
Libsigc++?????????????????? http://libsigc.sourceforge.net
libSigCX(對libSigC++的擴展) http://libsigx.sourceforge.net
sigslot??????????????????????? http://sigslot.sourceforge.net/
slotsig??????????????????????? http://slotsig.sourceforge.net/
????????????? 這個和上面的sigslot不是同一個東西,作者起的名字……一點新意都沒有,而且作者還提供了一個性能比較的benchmark,比較了qt、boost、libsigc++和自己,結果可以看這里:http://slotsig.sourceforge.net/doc/benchmarks.html
作者還說:The sigslot library has not been benchmarked, because it provides too less features than the others。當然Qt用的是完全另外一套東西,通過預編譯實現的signal / slot,個人覺得完全沒有可比性,當然Qt的實現方法也是我個人所討厭的,非要多一個預編譯器出來,開發時候極為不爽。

??? 找回以前的代碼,我在2002年的時候原來也已經實現過一個signal / slot,不過在slotsig作者眼中也是provides too less features。不過當然是自己夠用就行了。之所以要“重復開發”,原因之一是以上的很多lib不支持VC6,當時我還在用破破爛爛的VC6;一方面我也不愿意自己的project里面塞一大堆lib,特別是boost的,龐大的嚇人;一方面也就是自己能力的鍛煉;還有一方面就是發現有些lib里面的實現用了些trick(例如用byte array保存指針),這也是個人不喜歡的東西。

??? 其實實現的原理很簡單,先以一個簡單的例子說明:
假設需要處理?? int??? f(int a);的singl / slot,如果單是函數指針,那就太簡單了,slot就是函數指針,singal就是函數指針的數組。但現在還要加上對象的成員函數,于是就會想到把這兩種東西合并起來,但從外面看有相同的接口。其實function object就是這樣一種東西,不過function object只能在編譯時期實現普通函數和成員函數接口統一,但現在需要在運行時期,很自然就會想到了虛函數:
struct?slot1base
?? { virtual int fun(int a) = 0; };

typedef? SmartPotint?? slot1;

struct?singal1
{
??? int emit(int a) {??? /*?call each slot in m_listSlot?*/ }
??? void?connect( slot1 s) { m_listSlot.push_back(s); }

protected:
??? std::list?? m_listSlot;
};
其中SmartPoint就是帶引用計數的智能指針,很多實現的庫,隨便選一個吧。
很明顯,我們現在就是需要一個singal1,然后往它里面的m_listSlot里面不斷放slot1base的子類。現在要做的事情,就是要把不同的形如 int f(int)樣式的函數調用(包括普通函數和成員函數)統統轉換為slot1base的子類。于是就有很多子類出來了:

struct slot1func : public slot1base
{
?typedef int (* func)(int);
?
?slot1func(func p) : m_func(p) {}
?virtual int fun(int a) { return m_func(a); }
private:
?func?m_func;
};

template
struct slot1objfunc : public slot1base
{
?typedef?int (obj::*func)(int);
?
?slot1objfunc(obj * p, func pF) : m_obj(p),m_pfunc(pF) {}
?virtual int fun(int a) { return (m_obj->*m_func)(a); }
private:
?obj?*?m_obj;
?func?m_pfunc;
};

其實除了這兩種以外,還可以擴展出更多的子類,例如能自動進行函數參數的類型轉換的子類:
struct slot1func_for_short : public slot1base
{
?typedef?short (* func)(short);
?
?slot1func_for_short(func p) : m_func(p) {}
?virtual int fun(int a) { return m_func(a); }
private:
?func?m_func;
};
當然可以抽象為template
template
struct slot1func_for_other : public slot1base
{
?typedef?R2 (* func)(A2);
?
?slot1func_for_other(func p) : m_func(p) {}
?virtual int fun(int a) { return m_func(a); }
private:
?func?m_func;
};
同樣還應該有for object function的版本……
除了這些,還可以有更多的,例如處理object的const函數的;處理本來沒有返回值,每次需要虛擬一個返回值的函數;參數個數不一致,需要另外bind參數的……

現在有了很多子類以后,我們當然不希望要記著這么多子類的名稱,希望使用的時候只通過同一個接口就可以生成我們所需要的slot1,這時候就是經典的template function出場了:
slot1?slot(int (*func)(int))
?{ return slot1( new slot1func(func) ); }
template
?slot2?slot(obj * p, int (obj::*func)(int) )
??{ return slot1( new slot1objfunc(p,func) ); }
template
?slot2?slot( R2 (*func)(A2) )
??{ return slot1( new slot1func_for_other(func) ); }

應用的時候就可以:
int??? func1(int a) { ..... }
struct MyObj {??? int func2(int a) { .... } };

MyObj???? obj;

signal1????? onButtonClick;
onButtonClick.connect( slot( func1) );
onButtonClick.connect( slot( *obj, func2) );
return onButtonClick.emit( 100 );

原理很簡單吧,但這個只是int func(int)格式的slot1,如果參數不是int,返回值不是int呢?簡單,把上面的東西變成模版就行了。
template
struct?slot1base
?? { virtual?R fun(A1 a) = 0; };

template
struct slot1 : public? SmartPotint >?? {}

template
struct?singal1
{
????R emit(A a) {??? /*?call each slot in m_listSlot?*/ }
??? void?connect( slot1 s) { m_listSlot.push_back(s); }

protected:
??? std::list >?? m_listSlot;
};

……后面的子類也作相應的處理。

原理是簡單,不過要做一個完整的機制還要考慮更多的東西:
1、singal 和slot之間一般是“多對多”的關系,所以應該slot里面也有singal的列表,以方便雙向查找。
2、多線程下的重入問題,如何加上鎖,是需要仔細考慮的。
3、當一個singal里面包含多個slot的時候,那個返回值的處理,這個真的是多種多樣了:
???? 只要其中一個的返回值;所有返回值記錄在數組里面;當其中一個返回值是特定值時候不繼續后面的slot……
???? 所以一般都會在singal1的模版參數中增加一個TMarshal的類來處理返回值:
???? template
???? struct singal1
???? {
???????? R emit(A1 a)
???????? {
??????????? typeMarsh?marsh;
??????????? /* for each item in m_listSlot*/
??????????? {
???????????????? if (! marsh.toContinue( (*it)->fun(a)))
????????????????????? break;
??????????? }
??????????? return marsh.value();
???????? }
??? };
?而一個簡單TMarshal可以是這樣:
?template
??class TMarshal
??{
??public:
???TMarshal(void) : m_saveValue() {}
???static typeReturn?defaultValue(void) { return typeReturn(); }
???typeReturn?value(void) { return m_saveValue; }
???bool?toContinue(const typeReturn & val)
????{?m_saveValue = val;?return true;?}
??protected:
???typeReturn?m_saveValue;
??};
4、現在只是討論了一個參數的情況,多個參數的呢?好辦,copy/paste一個參數的,加上多個參數就是了,例如:
?template
??struct slot2base
???{? virtual R fun(A1 a1, A2 a2) = 0; };
?不過的確是很煩人的工作,于是很多lib都是通過宏來實現,例如:
?一個 signalslot.imp的文件里面:
?template
??struct?SLOTBASENAME
???{?virtual R fun(FUNC_ARGS) = 0; };
?……
?而singalslot.h里面就定義:
?#define TEMPLATE_ARGS?typename A1
?#define FUNC_ARGS??A1 a1
?#define SLOTBASENAME?slot1base
?#include "signalslot.imp"
?
?#define TEMPLATE_ARGS?typename A1,typename A2
?#define FUNC_ARGS??A1 a1, A2 a2
?#define SLOTBASENAME?slot2base
?#include "signalslot.imp"
?……
?
?更有甚者,直接用perl來生成.h文件……
5、需要更多的接口,方便使用,例如slot的查找、刪除、比較之類的。

posted on 2005-10-08 14:50 cyt 閱讀(5432) 評論(2)  編輯 收藏 引用
Comments
  • # re: 我自己的signal / slot實現
    joyfire
    Posted @ 2005-11-26 00:24
    引用了這篇文章,可是找補到trackback:(  回復  更多評論   
  • # re: 我自己的signal / slot實現
    你好!
    Posted @ 2007-06-15 09:02
    你好, 看了你的文章感覺你好厲害得說!
    我不是專門研究程序的人,可現在我有點小困難,你肯定知道怎么解決
    你的文章里說:
    而singalslot.h里面就定義:
    #define TEMPLATE_ARGS typename A1
    #define FUNC_ARGS A1 a1
    #define SLOTBASENAME slot1base
    #include "signalslot.imp"

    #define TEMPLATE_ARGS typename A1,typename A2
    #define FUNC_ARGS A1 a1, A2 a2
    #define SLOTBASENAME slot2base
    #include "signalslot.imp"
    ……
    我運行程序時候就缺少這個文件,一直在尋找這個頭文件,你能幫忙寫給我嗎?
    我的QQ346183499,全天再線
    謝謝了!  回復  更多評論   
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美大片第1页| 亚洲日韩第九十九页| 亚洲欧美中文字幕| 亚洲欧美一区二区精品久久久 | 老司机一区二区| 男男成人高潮片免费网站| 欧美激情综合| 亚洲午夜精品一区二区| 欧美在线视频在线播放完整版免费观看 | 欧美成人在线影院| 亚洲欧洲在线播放| 一区二区免费在线视频| 亚洲国产网站| 欧美日韩国产色综合一二三四| 欧美日韩精品中文字幕| 国产一区二区在线免费观看| 亚洲福利视频在线| 亚洲免费影视| 欧美大片在线观看一区| 正在播放欧美视频| 久久久久久成人| 欧美午夜电影在线| 伊人婷婷欧美激情| 午夜精品久久| 亚洲国产午夜| 久久成人这里只有精品| 欧美视频一区| 亚洲国产成人精品久久久国产成人一区| 日韩午夜av在线| 久久久噜久噜久久综合| 一区二区高清视频在线观看| 久久一区二区三区四区| 国产日韩综合| 亚洲伊人伊色伊影伊综合网| 亚洲第一精品福利| 久久精品亚洲精品| 国产区亚洲区欧美区| 亚洲性人人天天夜夜摸| 亚洲盗摄视频| 久久一区二区精品| 好吊日精品视频| 久久国产精品一区二区| 亚洲性夜色噜噜噜7777| 欧美日韩亚洲一区二区三区四区| 亚洲丁香婷深爱综合| 久久精品在线观看| 亚洲一区二区免费| 欧美日精品一区视频| 99视频精品| 亚洲毛片在线| 欧美日韩一卡二卡| 一区二区三区精品久久久| 亚洲国产精品电影在线观看| 麻豆精品网站| 亚洲区在线播放| 亚洲国产精品成人综合| 欧美寡妇偷汉性猛交| 亚洲精品欧美激情| 亚洲精品国产日韩| 欧美日韩大陆在线| 亚洲桃色在线一区| 亚洲视频在线视频| 国产区精品在线观看| 久久精品国产免费看久久精品| 午夜国产一区| 激情久久中文字幕| 欧美多人爱爱视频网站| 欧美大片专区| 亚洲一区免费网站| 午夜一区二区三区在线观看| 国产一区二区三区在线观看免费视频 | 国产丝袜美腿一区二区三区| 欧美一级网站| 欧美在线免费视屏| 在线播放亚洲| 最新国产成人av网站网址麻豆| 欧美黑人国产人伦爽爽爽| 一区二区激情小说| 午夜天堂精品久久久久| 在线观看日韩欧美| 亚洲日韩视频| 国产乱人伦精品一区二区 | 国产一区二区看久久| 久久视频在线视频| 欧美韩日一区二区| 欧美一区二区在线观看| 久久久久高清| 一个色综合av| 久久精品一区二区三区不卡| 亚洲欧洲一区二区在线播放| 亚洲天堂成人在线观看| 亚洲高清av在线| 在线亚洲成人| 亚洲国产综合在线| 亚洲一区在线免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲高清免费视频| 国产精品第2页| 女人天堂亚洲aⅴ在线观看| 欧美乱在线观看| 久久免费午夜影院| 欧美四级在线| 亚洲国产精品成人综合| 国产一区二区久久久| 洋洋av久久久久久久一区| 激情综合亚洲| 亚洲一区二区三| 日韩视频精品在线| 久久久国产精品一区| 亚洲一区视频在线| 毛片av中文字幕一区二区| 欧美一级在线亚洲天堂| 欧美日韩爆操| 亚洲黄色视屏| 亚洲国产成人porn| 欧美一级在线亚洲天堂| 亚洲制服少妇| 欧美精品一区在线发布| 欧美xart系列高清| 久久免费观看视频| 国产精品入口夜色视频大尺度 | 久久免费视频一区| 午夜影院日韩| 国产精品白丝黑袜喷水久久久| 欧美承认网站| 永久555www成人免费| 久久激情婷婷| 久久综合色播五月| 狠狠久久亚洲欧美专区| 欧美一区二区三区视频| 欧美在线视频一区二区三区| 国产精品久久久久久久午夜| 一区二区三区四区在线| 亚洲天堂男人| 国产精品久久国产精品99gif | 亚洲国产va精品久久久不卡综合| 欧美一区二区视频网站| 久久久高清一区二区三区| 国产区亚洲区欧美区| 欧美亚洲免费高清在线观看| 久久国产精品一区二区| 国内成+人亚洲| 久久亚洲图片| 亚洲黄色小视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 美脚丝袜一区二区三区在线观看| 国产亚洲福利一区| 久久精品色图| 欧美国产高清| 一区二区精品在线| 国产精品久久久久久久久久免费 | 原创国产精品91| 你懂的成人av| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美一区三区二区在线观看| 久久精品一二三| 亚洲国产cao| 欧美视频二区36p| 午夜一区二区三区在线观看| 欧美成人午夜剧场免费观看| 亚洲高清在线| 日韩性生活视频| 国产精品久线观看视频| 欧美有码在线观看视频| 亚洲福利视频一区二区| 亚洲午夜成aⅴ人片| 国产亚洲精品久久久| 欧美成人一区二区在线| 一区二区三区免费网站| 久久久亚洲一区| 亚洲另类春色国产| 国产精品主播| 欧美精品日本| 久久国产主播精品| 亚洲美女黄网| 另类人畜视频在线| 亚洲一区二区毛片| 亚洲第一精品夜夜躁人人爽| 欧美日韩中文精品| 久久天天综合| 亚洲综合色丁香婷婷六月图片| 欧美freesex8一10精品| 午夜精品一区二区三区在线| 亚洲精品韩国| 黄色国产精品| 国产精品区一区| 欧美片第1页综合| 久久影视三级福利片| 亚洲欧美在线观看| 9色porny自拍视频一区二区| 男女激情久久| 久久午夜国产精品| 欧美专区在线| 亚洲欧美日韩精品久久亚洲区| 最新日韩中文字幕| 激情视频一区二区三区| 国产欧美一区二区三区在线看蜜臀 | 99天天综合性| 亚洲国产精品www| 极品尤物av久久免费看|