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

專職C++

不能停止的腳步

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用鏈接

留言簿(28)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

這些模板的實現,我是參考了boost,VCL,及其他人的實現。并按照我的風格和要求,重新做了實現。

  1#ifndef _X_DELEGATE_H__
  2#define _X_DELEGATE_H__
  3
  4#include <xtype.h>
  5namespace zdh
  6{
  7    //空事件類型
  8    class XNULL_Event
  9    {
 10    private:
 11        XNULL_Event(){}
 12    }
;
 13    //函數類型定義
 14    template<class ClassType, 
 15    class P1 = XNULL_Event, class P2 = XNULL_Event, class P3 = XNULL_Event, 
 16    class P4 = XNULL_Event, class P5 = XNULL_Event, class P6 = XNULL_Event, 
 17    class P7 = XNULL_Event, class P8 = XNULL_Event, class P9 = XNULL_Event, 
 18    class P10 = XNULL_Event>
 19    struct SFunctionDefine
 20    {
 21        typedef void (ClassType::*F0)();
 22        typedef void (ClassType::*F1)(P1);
 23        typedef void (ClassType::*F2)(P1,P2);
 24        typedef void (ClassType::*F3)(P1,P2,P3);
 25        typedef void (ClassType::*F4)(P1,P2,P3,P4);
 26        typedef void (ClassType::*F5)(P1,P2,P3,P4,P5);
 27        typedef void (ClassType::*F6)(P1,P2,P3,P4,P5,P6);
 28        typedef void (ClassType::*F7)(P1,P2,P3,P4,P5,P6,P7);
 29        typedef void (ClassType::*F8)(P1,P2,P3,P4,P5,P6,P7,P8);
 30        typedef void (ClassType::*F9)(P1,P2,P3,P4,P5,P6,P7,P8,P9);
 31        typedef void (ClassType::*F10)(P1,P2,P3,P4,P5,P6,P7,P8,P9,P10);
 32    }
;
 33    //委托的基類
 34    class XDelegateBase
 35    {
 36    private:
 37        //這個結構體的做用是在bind的函數中,將函數指針轉換為void *
 38        template<class FunctionPointer>
 39        struct SFunctionPointer
 40        {
 41            FunctionPointer Pointer;
 42        }
;
 43    protected:
 44        void * m_DelegateObject;        ///<委托的對象
 45        void * m_DelegateFunction;      ///<委托的函數
 46    public:
 47        ///構造函數

 48        XDelegateBase()
 49            :m_DelegateFunction(NULL),m_DelegateObject(NULL)
 50        {}
 51        ///委托綁定
 52        template<class DelegateObjectType,class DelegateFunctionPointer>
 53        void Bind(DelegateObjectType * aDelegateObject, DelegateFunctionPointer aDelegateFunction)
 54        {
 55            SFunctionPointer<DelegateFunctionPointer> FunctionPtr = {aDelegateFunction };
 56            m_DelegateObject = (void *)aDelegateObject;
 57            m_DelegateFunction = *(void **)&FunctionPtr;  
 58        }

 59        ///解除綁定
 60        void UnBind() 
 61        {
 62            m_DelegateFunction = NULL;
 63            m_DelegateObject = NULL;
 64        }

 65        ///判斷是否已經被綁定
 66        bool isBinded() const
 67        {
 68            return m_DelegateFunction != NULL;
 69        }

 70    }
;
 71    //無參數函數委托類
 72    template<class T>
 73    class XDelegate0 : public XDelegateBase
 74    {
 75    public:
 76        typedef typename SFunctionDefine<XNULL_Event>::F0 Function;
 77        void Invoke()
 78        {
 79            if( m_DelegateFunction != NULL )
 80            {
 81                Function Fun;
 82                *(void **)&Fun = m_DelegateFunction;
 83                (((XNULL_Event *)m_DelegateObject)->*Fun)();
 84            }

 85
 86        }

 87    }
;
 88    //一個參數函數委托類
 89    template<class P1>
 90    class XDelegate1 : public XDelegateBase
 91    {
 92    public:
 93        typedef typename SFunctionDefine<XNULL_Event,P1>::F1 Function;
 94        void Invoke(P1 aP1)
 95        {
 96            if( m_DelegateFunction != NULL )
 97            {
 98                Function Fun;
 99                *(void **)&Fun = m_DelegateFunction;
100                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1);
101            }

102        }

103    }
;
104
105    //兩個參數函數委托類
106    template<class P1,class P2>
107    class XDelegate2 : public XDelegateBase
108    {
109    public:
110        typedef typename SFunctionDefine<XNULL_Event,P1,P2>::F2 Function;
111        void Invoke(P1 aP1,P2 aP2)
112        {
113            if( m_DelegateFunction != NULL )
114            {
115                Function Fun;
116                *(void **)&Fun = m_DelegateFunction;
117                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2);
118            }

119        }

120    }
;
121
122    //三個參數函數委托類
123    template<class P1,class P2,class P3>
124    class XDelegate3 : public XDelegateBase
125    {
126    public:
127        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3>::F3 Function;
128        void Invoke(P1 aP1,P2 aP2,P3 aP3)
129        {
130            if( m_DelegateFunction != NULL )
131            {
132                Function Fun;
133                *(void **)&Fun = m_DelegateFunction;
134                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3);
135            }

136        }

137    }
;
138
139    //四個參數函數委托類
140    template<class P1,class P2,class P3, class P4>
141    class XDelegate4 : public XDelegateBase
142    {
143    public:
144        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4>::F4 Function;
145        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4)
146        {
147            if( m_DelegateFunction != NULL )
148            {
149                Function Fun;
150                *(void **)&Fun = m_DelegateFunction;
151                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3,aP4);
152            }

153        }

154    }
;
155
156    //五個參數函數委托類
157    template<class P1,class P2,class P3, class P4, class P5>
158    class XDelegate5 : public XDelegateBase
159    {
160    public:
161        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5>::F5 Function;
162        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5)
163        {
164            if( m_DelegateFunction != NULL )
165            {
166                Function Fun;
167                *(void **)&Fun = m_DelegateFunction;
168                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5);
169            }

170        }

171    }
;
172    //六個參數函數委托類
173    template<class P1,class P2,class P3, class P4, class P5, class P6>
174    class XDelegate6 : public XDelegateBase
175    {
176    public:
177        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6>::F6 Function;
178        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6)
179        {
180            if( m_DelegateFunction != NULL )
181            {
182                Function Fun;
183                *(void **)&Fun = m_DelegateFunction;
184                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6);
185            }

186        }

187    }
;
188
189    //七個參數函數委托類
190    template<class P1,class P2,class P3, class P4, class P5, class P6, class P7>
191    class XDelegate7 : public XDelegateBase
192    {
193    public:
194        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7>::F7 Function;
195        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7)
196        {
197            if( m_DelegateFunction != NULL )
198            {
199                Function Fun;
200                *(void **)&Fun = m_DelegateFunction;
201                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7);
202            }

203        }

204    }
;
205    //八個參數函數委托類
206    template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8>
207    class XDelegate8 : public XDelegateBase
208    {
209    public:
210        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8>::F8 Function;
211        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8)
212        {
213            if( m_DelegateFunction != NULL )
214            {
215                Function Fun;
216                *(void **)&Fun = m_DelegateFunction;
217                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8);
218            }

219        }

220    }
;
221    //九個參數函數委托類
222    template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8, class P9>
223    class XDelegate9 : public XDelegateBase
224    {
225    public:
226        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8,P9>::F9 Function;
227        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8,P9 aP9)
228        {
229            if( m_DelegateFunction != NULL )
230            {
231                Function Fun;
232                *(void **)&Fun = m_DelegateFunction;
233                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8,aP9);
234            }

235        }

236    }
;
237    //十個參數函數委托類
238    template<class P1,class P2,class P3, class P4, class P5, class P6, class P7,class P8, class P9,class P10>
239    class XDelegate10 : public XDelegateBase
240    {
241    public:
242        typedef typename SFunctionDefine<XNULL_Event,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10>::F10 Function;
243        void Invoke(P1 aP1,P2 aP2,P3 aP3,P4 aP4, P5 aP5, P6 aP6, P7 aP7,P8 aP8,P9 aP9,P10 aP10)
244        {
245            if( m_DelegateFunction != NULL )
246            {
247                Function Fun;
248                *(void **)&Fun = m_DelegateFunction;
249                (((XNULL_Event *)m_DelegateObject)->*Fun)(aP1, aP2, aP3, aP4, aP5, aP6, aP7, aP8, aP9, aP10);
250            }

251        }

252    }
;
253}

254#endif // _ZY_DELEGATE_H__
255

示例代碼:
 1//未測試的示例代碼
 2class XObject
 3{
 4public:
 5    ZY_Delegate0<NULL> EventClick;
 6}
;
 7class XButton
 8{
 9public:
10    XButton()
11    {
12        EventClick.Bind(this,&XButton::OnClick);
13    }

14
15private:
16    void OnClick()
17    {
18        printf("hello On Click");
19    }

20}
;
21int main()
22{
23    XAutoPtr<XObject> p = new XButton();
24    p->EventClick->Invoke();
25}
posted on 2010-04-17 12:40 冬瓜 閱讀(473) 評論(1)  編輯 收藏 引用 所屬分類: 原創

Feedback

# re: 委托函數模板 2010-10-22 16:38 abc
看見這么多C++代碼就頭疼,還是C簡潔  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲最新视频在线播放| 欧美va天堂| 欧美大片在线观看一区| 亚洲国产精品毛片| 欧美激情第4页| 一本色道久久加勒比精品 | 伊人成人开心激情综合网| 久久影院午夜论| 日韩视频不卡| 久久久久久欧美| 亚洲国产精品久久精品怡红院| 欧美精品久久一区二区| 99这里只有精品| 久久免费黄色| 日韩午夜激情电影| 国产精品日韩精品| 久久亚洲综合网| 亚洲一区二区日本| 欧美 日韩 国产精品免费观看| 亚洲免费观看在线观看| 国产精品一区二区久久| 免费观看亚洲视频大全| 一区二区三区鲁丝不卡| 欧美1区视频| 亚洲欧美成人一区二区在线电影| 国户精品久久久久久久久久久不卡| 毛片一区二区| 亚洲制服少妇| 亚洲国产精品电影| 欧美影院成人| 在线视频精品一区| 一区二区三区亚洲| 国产精品久久久久91| 牛夜精品久久久久久久99黑人| 亚洲欧美成人一区二区在线电影| 欧美大色视频| 久久久久久久综合色一本| 一区二区三区国产在线| 亚洲国产精品一区二区尤物区| 国产精品高潮呻吟久久| 欧美二区在线观看| 久久久精品国产免费观看同学| 中日韩美女免费视频网址在线观看| 欧美成人免费播放| 久久精品99久久香蕉国产色戒| 99在线热播精品免费99热| 依依成人综合视频| 国产日韩av在线播放| 欧美日韩亚洲激情| 欧美成人黑人xx视频免费观看| 性欧美激情精品| 正在播放日韩| 亚洲美女黄网| 亚洲日韩成人| 亚洲电影在线播放| 欧美大秀在线观看| 免费看亚洲片| 久热精品视频在线观看一区| 午夜精品av| 亚洲欧美清纯在线制服| 亚洲一区二区在线免费观看视频| 99精品国产99久久久久久福利| 亚洲高清在线观看| 亚洲黑丝一区二区| 亚洲人成网站999久久久综合 | 亚洲肉体裸体xxxx137| 黄色亚洲在线| 国产一区在线观看视频| 国产一区二区三区精品久久久| 国产美女在线精品免费观看| 国产精品欧美日韩久久| 国产精品视频免费在线观看| 国产精品美女xx| 国产精品日韩欧美一区二区三区| 国产精品卡一卡二卡三| 国产精品视频成人| 国产美女精品一区二区三区| 国产精品日韩精品| 国产日韩1区| 伊人精品久久久久7777| 亚洲第一成人在线| 亚洲精品久久久久久久久久久 | 麻豆精品国产91久久久久久| 久久香蕉国产线看观看网| 另类欧美日韩国产在线| 麻豆精品视频在线观看| 欧美肥婆bbw| 日韩视频在线永久播放| 亚洲伊人第一页| 欧美一区二区日韩| 久久这里有精品视频 | 国产精品国产三级国产专播精品人 | 久久精品中文字幕免费mv| 久久久999精品视频| 久久影院午夜片一区| 欧美国产先锋| 国产伦精品一区二区三区| 狠狠干综合网| 99精品国产热久久91蜜凸| 性xx色xx综合久久久xx| 美女网站久久| 一本色道久久综合亚洲精品按摩| 亚洲欧美日韩中文视频| 久久香蕉国产线看观看网| 欧美日韩岛国| 国产一级久久| 99热这里只有成人精品国产| 亚洲欧美文学| 欧美激情五月| 亚洲永久免费视频| 美女在线一区二区| 国产精品视频免费在线观看| 在线免费高清一区二区三区| 亚洲线精品一区二区三区八戒| 久久精品亚洲精品| 亚洲精品久久久久久下一站| 欧美一级片一区| 欧美日产一区二区三区在线观看| 国产日韩欧美一区二区| 亚洲人成人一区二区三区| 欧美综合77777色婷婷| 亚洲黄页视频免费观看| 久久精品国产清自在天天线| 欧美日韩在线观看一区二区| 一区二区在线观看视频在线观看 | 欧美一区二区免费| 欧美人与性禽动交情品 | 亚洲电影免费在线观看| 性欧美精品高清| 亚洲美洲欧洲综合国产一区| 久久久高清一区二区三区| 国产精品乱码人人做人人爱| 亚洲欧洲一二三| 久久亚裔精品欧美| 亚洲字幕在线观看| 欧美日韩成人网| 91久久国产综合久久蜜月精品 | 亚洲美女av在线播放| 久久久久高清| 亚洲欧美日韩成人高清在线一区| 欧美大片免费看| 在线观看欧美精品| 久久综合国产精品| 亚洲欧美视频在线观看| 欧美亚洲成人精品| 99re热这里只有精品免费视频| 另类天堂视频在线观看| 欧美一区二区三区精品| 国产精品免费网站| 亚洲中字黄色| 一区二区三区视频观看| 欧美精品在线一区| 夜夜嗨av色一区二区不卡| 亚洲福利国产| 欧美α欧美αv大片| 在线看成人片| 欧美国产综合视频| 蜜桃久久av一区| 亚洲国产综合在线看不卡| 模特精品裸拍一区| 久久久精品国产免费观看同学| 韩国av一区二区三区| 久久精品网址| 久久精品国产亚洲5555| 精品91在线| 欧美大片91| 欧美高清一区| 在线视频精品一区| 亚洲天堂成人在线观看| 国产精品香蕉在线观看| 久久精品国产第一区二区三区最新章节 | 欧美精品一区二区三区久久久竹菊| 亚洲激情一区| 亚洲精品欧美精品| 欧美日韩视频在线观看一区二区三区| 日韩一级不卡| 国产精品99久久久久久www| 国产乱肥老妇国产一区二 | 欧美大片在线看免费观看| 美女国产一区| 亚洲图片在线观看| 午夜视频在线观看一区二区三区| 国产欧美日本一区视频| 久久亚洲视频| 免费成人网www| 亚洲午夜三级在线| 午夜欧美大尺度福利影院在线看| 好男人免费精品视频| 亚洲福利视频网站| 欧美视频日韩视频| 欧美在线免费看| 美女精品在线| 亚洲欧美国产77777| 久久精品日韩欧美| 99热这里只有精品8| 亚洲一区二区三区四区五区午夜| 韩国精品一区二区三区| 亚洲国产一区二区三区a毛片| 国产精品亚洲аv天堂网| 嫩草国产精品入口|