• <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 閱讀(532) 評論(0)  編輯 收藏 引用 所屬分類: C++
            国产精品无码久久综合网| 婷婷国产天堂久久综合五月| 久久中文骚妇内射| 亚洲中文字幕无码久久精品1| 久久亚洲AV成人无码国产| 91精品久久久久久无码| 麻豆国内精品久久久久久| 久久精品国产亚洲AV无码娇色 | 久久精品中文字幕第23页| 欧美精品福利视频一区二区三区久久久精品 | 亚洲精品高清国产一线久久| 国产成人综合久久综合| 日本加勒比久久精品| 久久精品国产亚洲AV无码娇色| 亚洲国产精品成人AV无码久久综合影院| 亚洲中文字幕无码久久2017| 精品无码久久久久久久久久| 久久精品国产99久久久| 7777精品伊人久久久大香线蕉| 久久精品人人做人人爽电影| 亚洲色大成网站www久久九| 国产亚洲精久久久久久无码AV| 久久亚洲精精品中文字幕| 久久久人妻精品无码一区| 91精品国产91久久久久久青草| 国产亚洲精久久久久久无码77777| 国产综合成人久久大片91| 成人国内精品久久久久一区| 亚洲精品乱码久久久久66| 久久久久亚洲AV无码专区首JN | 久久夜色精品国产噜噜噜亚洲AV | 无码任你躁久久久久久久| 色综合久久最新中文字幕| 97精品国产91久久久久久| 久久精品99久久香蕉国产色戒| 久久精品国产精品亚洲精品| 日产久久强奸免费的看| 污污内射久久一区二区欧美日韩| 午夜福利91久久福利| 一本大道久久东京热无码AV | 久久精品国产亚洲AV嫖农村妇女|