• <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++
            91精品国产9l久久久久| 久久精品亚洲欧美日韩久久| 久久婷婷五月综合成人D啪| 一本大道久久东京热无码AV| 久久亚洲日韩看片无码| 久久精品蜜芽亚洲国产AV| 精品视频久久久久| 亚洲国产精品无码久久一线| 大蕉久久伊人中文字幕| 久久精品国产亚洲AV久| 草草久久久无码国产专区| 亚洲色大成网站www久久九| 99久久免费只有精品国产| 国产色综合久久无码有码| 久久夜色精品国产亚洲| 无码精品久久久天天影视| 日本久久久精品中文字幕| 亚洲中文字幕无码久久精品1| 99久久人人爽亚洲精品美女| 日韩人妻无码精品久久免费一 | 久久亚洲AV无码精品色午夜| 久久香蕉一级毛片| 久久婷婷五月综合国产尤物app| 亚洲一区精品伊人久久伊人| 亚洲国产精品久久久久| 久久久久成人精品无码中文字幕| 久久久久99这里有精品10| 久久久久久久亚洲精品| 国产精品成人99久久久久91gav| 嫩草伊人久久精品少妇AV| 亚洲国产美女精品久久久久∴| 国产精品美女久久福利网站| 国产精品久久久久一区二区三区 | 国产成人久久精品激情| 亚洲精品无码专区久久久| 久久久久久午夜精品| 午夜精品久久久久| 久久国产AVJUST麻豆| 久久伊人五月丁香狠狠色| 97精品国产97久久久久久免费| 日本人妻丰满熟妇久久久久久 |