• <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>
            posts - 17,  comments - 2,  trackbacks - 0
            Delegate in Standard C++
            Rating: 

            Ben Chun Pong Chan (view profile)
            January 28, 2002

            Environment: ANSI/ISO C++

            Microsoft introduced a new feature called "delegates" in the .NET framework. It is actually a class that holds a list of function pointers. As long as they own the same function signature, the delegate object can hold static, global, or member function pointers. Now I'm going to do the same in a "unmanaged C++" by way of using the "external polymorphism" pattern.


            (continued)

             

            1. Construct the abstract delegate base class

            class Delegate {
            public:
                  virtual void Invoke()=0;
            protected:
                  Delegate(){}
                  virtual ~Delegate(){}
            };

            2. Construct a derive class which accepts a static/global function pointer

            //NonTypeDelegate.h
            #include "Delegate.h"
            
            class NonTypeDelegate : public Delegate
            {
            public:
               void Invoke();
               NonTypeDelegate(void (*pfn)(int),int iParam);
               virtual ~NonTypeDelegate(){}
            private:
               void (*m_pfn)(int);
               int m_iParam;
            };
            
            //NonTypeDelegate.cpp
            #include "NonTypeDelegate.h"
            #include <iostream>
            
            using namespace std;
            
            NonTypeDelegate::NonTypeDelegate(void (*pfn)(int),
                                             int iParam):m_pfn(pfn),
                                             m_iParam(iParam)
            {
            }
            
            void NonTypeDelegate::Invoke()
            {
               cout << "NonTypeDelegate Invoke\r\n";
               m_pfn(m_iParam);
            }

            3. Construct another derive class which accepts a member function pointer

            //TypeDelegate.hpp
            #include "Delegate.h"
            #include <iostream>
            
            using namespace std;
            
            template <typename T>
            
            class TypeDelegate : public Delegate
            {
            public:
               void Invoke();
               TypeDelegate(T &t, void (T::*pfn)(int), int iParam);
               ~TypeDelegate(){}
            
            private:
               T m_t;
               void (T::*m_pfn)(int);
               int m_iParam;
            };
            
            template<typename T>
            TypeDelegate<T>::TypeDelegate(T &t,
                                          void (T::*pfn)(int),
                                          int iParam):m_t(t),
                                          m_pfn(pfn),
                                          m_iParam(iParam)
            {
            }
            
            template<typename T>
            
            void TypeDelegate<T7gt;::Invoke()
            {
               cout << "TypeDelegate Invoke\r\n";
               (m_t.*m_pfn)(m_iParam);
            }

            4. Now glue up all the stuffs

            #include <iostream>
            #include "NonTypeDelegate.h"
            #include "TypeDelegate.hpp"
            #include <vector>
            
            using namespace std;
            
            void Test(int iParam)
            {
               cout << "Test Invoked\r\n";
            }
            
            class A
            {
             public:
                void Test(int iParam)
                {
                   cout << "A::Test Invoked\r\n";
                }
            };
            
            int main(int argc, char* argv[])
            {
               NonTypeDelegate nTDelegate(Test,1);
            
               A a;
               TypeDelegate<A> tDelegate(a,A::Test,2);
            
               vector<Delegate*> vecpDelegate;
               vecpDelegate.push_back(&nTDelegate);
               vecpDelegate.push_back(&tDelegate);
            
               for (vector<Delegate*>::const_iterator kItr=vecpDelegate.begin();
                   kItr!=vecpDelegate.end();
                   ++kItr)
               {
                   (*kItr)->Invoke();
               }
            
               return 0;
            }

            5. And the output is

            NonTypeDelegate Invoke
            Test Invoked
            TypeDelegate Invoke
            A::Test Invoked

            Conclusion

            Actually, you can derive a class which can accept different signature of functions pointer. Thanks to the powerful "external polymorphism" pattern.

            References

            Chris Cleeland, Douglas C.Schmidt and Timothy H.Harrison External Polymorphism : An Object Structural Pattern for Transparently Extending C++ Concrete Data Types

            posted on 2008-11-06 23:29 BeyondCN 閱讀(533) 評論(0)  編輯 收藏 引用 所屬分類: C++
            亚洲国产婷婷香蕉久久久久久| 久久99精品国产99久久| 免费精品久久天干天干| 精品久久久久中文字幕日本| 亚洲国产天堂久久综合网站| 久久天天躁狠狠躁夜夜不卡| 久久人人爽人人爽人人片av麻烦| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久婷婷综合中文字幕| 国产精品无码久久四虎| 久久大香萑太香蕉av| 国内精品久久久久影院免费| 亚洲国产成人久久一区WWW| 成人国内精品久久久久影院| 国产精品久久久久久久app| 久久AV高清无码| 精品伊人久久久| 久久国产免费直播| 久久99热狠狠色精品一区| 国产69精品久久久久APP下载| 色综合久久精品中文字幕首页| 老男人久久青草av高清| 久久久久亚洲AV无码专区桃色| 97热久久免费频精品99| 久久精品国产久精国产果冻传媒| 久久精品人妻一区二区三区| 精品免费tv久久久久久久| 久久天天躁夜夜躁狠狠| 久久免费99精品国产自在现线 | 久久婷婷五月综合国产尤物app | 精品熟女少妇a∨免费久久| 亚洲欧美精品一区久久中文字幕| 亚洲国产精品久久久久婷婷老年| 久久精品中文騷妇女内射| 日本强好片久久久久久AAA| 久久精品国产亚洲AV香蕉| 久久人人爽人人爽人人爽| 欧美日韩精品久久免费| 久久这里只有精品首页| 久久国产欧美日韩精品免费| 久久久久久免费视频|