• <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>

            專職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 冬瓜 閱讀(460) 評論(1)  編輯 收藏 引用 所屬分類: 原創

            Feedback

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

            久久精品日日躁夜夜躁欧美| 国产精品9999久久久久| 亚洲国产精品无码久久青草| 久久人人爽人人爽人人片AV东京热| 久久丫精品国产亚洲av不卡 | 久久天堂电影网| 性欧美大战久久久久久久| 久久久久av无码免费网| 久久综合狠狠色综合伊人| 欧美久久一级内射wwwwww.| 久久99精品国产麻豆| 亚洲欧美日韩精品久久亚洲区| 久久久久久午夜成人影院| 日韩久久无码免费毛片软件| 精品久久久久久无码专区不卡| 久久亚洲精品国产亚洲老地址 | 日日噜噜夜夜狠狠久久丁香五月| 99久久99久久精品国产片| 日韩精品久久久肉伦网站| 久久久久国色AV免费看图片| 国产美女久久精品香蕉69| 99久久免费国产精品特黄| 国产精品欧美久久久久无广告| 久久棈精品久久久久久噜噜| 久久99精品国产麻豆宅宅| 久久毛片免费看一区二区三区| 久久亚洲精品中文字幕三区| 久久亚洲精品成人av无码网站| 久久久无码精品亚洲日韩京东传媒| 久久99精品久久久久久齐齐| 久久精品嫩草影院| 久久精品国产影库免费看| 99精品久久精品一区二区| 99久久99久久精品国产片果冻 | 久久精品人人做人人爽97| 亚洲午夜久久久久妓女影院 | 久久精品中文字幕无码绿巨人| 99久久香蕉国产线看观香| 欧美亚洲国产精品久久| 久久久久久久精品成人热色戒 | 久久免费的精品国产V∧|