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

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 閱讀(554) 評論(0)  編輯 收藏 引用 所屬分類: C++

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产亚洲另类动漫| 国产乱子伦一区二区三区国色天香| 国产日本亚洲高清| 欧美一区91| 久久精品国产清自在天天线| 国产在线欧美| 欧美99久久| 欧美精品一区二区三区久久久竹菊| 亚洲日韩视频| 99精品欧美一区| 国产精品一区免费在线观看| 久久噜噜噜精品国产亚洲综合| 久久精品日产第一区二区| …久久精品99久久香蕉国产| 亚洲第一福利社区| 欧美日本国产精品| 亚洲欧美清纯在线制服| 久久福利一区| 亚洲精品午夜精品| 亚洲欧美在线免费| 亚洲电影在线| 一区二区三区免费网站| 狠狠久久婷婷| 日韩视频免费大全中文字幕| 国产欧美日韩高清| 欧美国产在线观看| 国产精品一区二区三区乱码| 欧美成人日本| 欧美亚韩一区| 欧美电影电视剧在线观看| 欧美性事免费在线观看| 美日韩丰满少妇在线观看| 欧美精品三区| 免费在线亚洲欧美| 国产精品久久久一区麻豆最新章节| 麻豆精品在线观看| 欧美午夜一区二区福利视频| 欧美韩日高清| 国产日韩欧美综合一区| 亚洲精品视频在线播放| 在线观看欧美日韩国产| 亚洲欧美大片| 亚洲一级片在线观看| 另类专区欧美制服同性| 性一交一乱一区二区洋洋av| 欧美极品一区二区三区| 老**午夜毛片一区二区三区| 国产精品毛片大码女人 | 欧美日韩精品免费观看| 久久九九免费视频| 国产精品美女主播| 亚洲久久一区二区| 最新中文字幕亚洲| 快she精品国产999| 久久国产视频网| 国产精品日本欧美一区二区三区| 亚洲三级毛片| 亚洲精品国产日韩| 麻豆精品在线播放| 欧美黑人一区二区三区| 一区二区在线视频| 久久精品国亚洲| 久久综合九色99| 国产亚洲精品久久久久久| 亚洲桃色在线一区| 亚洲欧美视频一区| 国产精品无码永久免费888| 亚洲视频电影图片偷拍一区| 亚洲手机成人高清视频| 欧美三级免费| 亚洲视频导航| 欧美伊人久久久久久久久影院 | 欧美大片免费久久精品三p | 亚洲视频电影图片偷拍一区| 一区二区三区欧美在线| 欧美日韩三区四区| 日韩视频免费观看| 亚洲欧美国产制服动漫| 国产精品一区二区a| 亚洲欧美日韩精品久久久| 欧美影片第一页| 影音国产精品| 欧美电影免费观看网站| 亚洲精品乱码久久久久久日本蜜臀| 99精品欧美一区二区蜜桃免费| 欧美日韩国产高清视频| 亚洲午夜视频| 美日韩精品免费| 日韩一区二区精品视频| 欧美日韩在线一区| 亚洲欧美精品| 欧美国产极速在线| 亚洲视屏一区| 狠狠入ady亚洲精品| 欧美精品乱码久久久久久按摩| 99精品欧美| 久久精品九九| 一区二区福利| 国产日韩欧美麻豆| 欧美成黄导航| 香蕉久久久久久久av网站| 免费欧美在线| 午夜精品久久久久久久男人的天堂| 国产亚洲精品久久久久婷婷瑜伽| 欧美aⅴ99久久黑人专区| 亚洲午夜精品福利| 毛片一区二区| 亚洲中午字幕| 亚洲高清视频一区| 国产精品一区二区在线| 老司机免费视频一区二区| 一本一本久久| 欧美不卡福利| 欧美专区在线观看一区| 一本到高清视频免费精品| 国产日韩欧美综合精品| 欧美日韩国产综合网| 久久久成人精品| 亚洲欧美成人网| 日韩午夜三级在线| 欧美激情一区二区三区不卡| 欧美一区三区二区在线观看| 一本综合精品| 亚洲精品色图| 亚洲国产视频直播| 韩日午夜在线资源一区二区| 国产精品久久久久久久久久久久| 美女黄色成人网| 久久精品国产69国产精品亚洲| 亚洲午夜久久久久久尤物| 亚洲精品1区2区| 欧美电影资源| 欧美成人a视频| 久久综合伊人77777麻豆| 欧美亚洲色图校园春色| 在线一区观看| 一区二区动漫| 一区二区三区视频在线 | 国产一区99| 国产日韩久久| 国产色视频一区| 国产精品系列在线| 国产女精品视频网站免费| 欧美视频福利| 国产精品久久久久毛片大屁完整版| 欧美日韩精品福利| 欧美日韩一区二区三区在线观看免| 欧美激情a∨在线视频播放| 免费成人在线视频网站| 久久夜色撩人精品| 你懂的国产精品| 欧美精品在线一区二区| 美女被久久久| 欧美精品国产| 欧美三级韩国三级日本三斤| 欧美色图天堂网| 国产精品久久久久一区二区| 国产精品yjizz| 国产美女扒开尿口久久久| 国产一区二区三区无遮挡| 精品成人在线观看| 亚洲国产婷婷| 亚洲午夜精品一区二区三区他趣| 亚洲一区二区在线免费观看视频| 性久久久久久久久| 麻豆精品视频| 亚洲精品一区二区三区在线观看 | 亚洲性感激情| 欧美中文字幕| 欧美mv日韩mv亚洲| 欧美吻胸吃奶大尺度电影| 国产精品日韩在线| 伊人男人综合视频网| 亚洲精品视频免费| 午夜国产精品视频| 鲁大师成人一区二区三区| 亚洲国产91| 亚洲欧美在线高清| 欧美电影在线观看| 国产精品美女久久久久久久| 国产综合在线看| 中文亚洲视频在线| 久久九九久精品国产免费直播| 亚洲国产一区二区视频| 亚洲一区二区在线免费观看视频| 久久久久久网站| 国产精品试看| 99re在线精品| 久久综合久久综合久久| 99国产一区二区三精品乱码| 久久久精品国产免费观看同学| 欧美日韩综合视频| 亚洲黄色毛片| 久久五月婷婷丁香社区| 亚洲国产欧美在线 | 亚洲国产精品高清久久久| 亚洲影院色在线观看免费| 免费成人高清在线视频| 国产欧美一级| 亚洲曰本av电影|