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

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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            影音先锋久久| 欧美在线视屏| 亚洲性xxxx| 一区二区日韩欧美| 99精品视频一区| 亚洲毛片网站| 在线一区亚洲| 亚洲欧美制服另类日韩| 99精品99| 亚洲一区二区精品视频| 亚洲一区二区三区乱码aⅴ| 洋洋av久久久久久久一区| 国产精品99久久久久久久女警 | 亚洲一级片在线观看| 一区二区三区毛片| 小处雏高清一区二区三区| 久久精品日韩| 亚洲国产精品一区二区www| 麻豆成人在线| 欧美高清hd18日本| 欧美亚州一区二区三区| 国产亚洲欧美另类中文| 亚洲高清三级视频| 亚洲在线第一页| 久久九九99视频| 亚洲电影免费观看高清完整版在线观看 | 国产精品日韩欧美一区二区三区| 国产一区二区三区高清播放| 亚洲国产免费| 欧美在线高清| 亚洲精选在线| 可以看av的网站久久看| 国产精品成人aaaaa网站| 国产亚洲综合性久久久影院| 9人人澡人人爽人人精品| 久久黄色影院| 99视频在线观看一区三区| 欧美影院久久久| 欧美日韩国产综合视频在线| 激情一区二区| 久久激五月天综合精品| 日韩亚洲视频| 欧美精品乱码久久久久久按摩| 国产精品在线看| 日韩视频一区| 欧美高清在线观看| 久久九九久精品国产免费直播| 欧美三级电影一区| 亚洲国产一区二区精品专区| 久久国产欧美| 亚洲午夜免费视频| 欧美日韩在线影院| 一区二区三区精品视频| 亚洲国产精品美女| 另类春色校园亚洲| 永久域名在线精品| 美女啪啪无遮挡免费久久网站| 亚洲综合清纯丝袜自拍| 欧美日韩精品久久久| 亚洲国产一区在线| 免费成人高清视频| 久久资源在线| 一区二区自拍| 美女脱光内衣内裤视频久久影院| 午夜精品一区二区三区在线视 | 欧美区日韩区| 亚洲啪啪91| 免费成人高清| 亚洲黄页一区| 欧美成人首页| 免费日韩成人| 一区二区三区国产盗摄| 一区二区三区精品| 国产精品视频不卡| 欧美专区日韩视频| 久久久久久婷| 亚洲国产精品一区二区第一页| 欧美不卡视频一区发布| 美女999久久久精品视频| 亚洲国产精品成人va在线观看| 免费精品视频| 欧美激情一二三区| 亚洲欧美日韩网| 欧美淫片网站| 亚洲欧洲精品一区二区三区不卡 | 亚洲国产mv| 欧美日韩亚洲天堂| 新狼窝色av性久久久久久| 欧美一区二区久久久| 在线高清一区| 99ri日韩精品视频| 国产日韩精品在线观看| 久久午夜精品一区二区| 欧美多人爱爱视频网站| 亚洲一区二区视频| 久久精品亚洲一区| 日韩亚洲欧美高清| 亚洲欧美日本日韩| 亚洲国产精品女人久久久| 一本色道久久综合亚洲精品不卡| 国产精品一二| 欧美大片免费观看| 国产老女人精品毛片久久| 久久综合伊人77777尤物| 欧美精品在线播放| 久久久久久久97| 欧美日韩成人综合天天影院| 欧美在线国产| 欧美日韩在线三区| 欧美与欧洲交xxxx免费观看| 老司机一区二区三区| 在线亚洲伦理| 欧美在线首页| 亚洲欧美日韩区| 欧美极品在线视频| 开心色5月久久精品| 国产精品久久久久秋霞鲁丝| 欧美福利一区二区三区| 国产欧美日韩伦理| 99视频在线精品国自产拍免费观看 | 日韩一区二区久久| 国产精品三级视频| 玖玖视频精品| 国产精品美女黄网| 亚洲精品国产系列| 亚洲福利视频网| 欧美一区二区三区视频免费播放| 一区二区av在线| 男女激情视频一区| 久久一区二区精品| 国产一区二区三区奇米久涩| 一区二区三区国产| 正在播放欧美视频| 欧美日韩国产二区| 亚洲精品视频在线看| 亚洲国产一区在线| 麻豆成人精品| 亚洲国产精品ⅴa在线观看 | 亚洲自拍偷拍一区| 欧美日韩午夜| 夜夜嗨av一区二区三区四季av| 亚洲国产日韩美| 毛片av中文字幕一区二区| 鲁大师影院一区二区三区| 国内精品久久久久久久97牛牛| 性色av香蕉一区二区| 久久精品国产免费观看| 国产欧美在线观看一区| 欧美一区二视频| 乱码第一页成人| 在线精品亚洲一区二区| 久久一区二区三区av| 欧美激情视频一区二区三区在线播放| 国产一区二区三区最好精华液| 欧美一级片久久久久久久| 久久夜色精品国产欧美乱极品| 亚洲风情在线资源站| 欧美剧在线免费观看网站| 一二美女精品欧洲| 欧美一区二区成人| 加勒比av一区二区| 毛片一区二区三区| 日韩视频在线观看免费| 午夜欧美精品久久久久久久| 国产日韩欧美不卡| 老司机午夜精品视频在线观看| 欧美成人午夜77777| 一卡二卡3卡四卡高清精品视频| 国产精品日日摸夜夜添夜夜av| 欧美亚洲视频一区二区| 免费亚洲一区二区| 亚洲视频香蕉人妖| 国产一区二区三区免费不卡 | 这里只有精品在线播放| 久久久777| 亚洲精品一区二区在线| 欧美性淫爽ww久久久久无| 欧美一区二区精品| 亚洲人成在线播放网站岛国| 香蕉久久精品日日躁夜夜躁| 在线观看一区视频| 欧美色图五月天| 久久躁狠狠躁夜夜爽| 在线视频欧美日韩精品| 免费视频亚洲| 91久久国产综合久久| 欧美91视频| 亚洲综合导航| 亚洲黄一区二区| 国产三级欧美三级日产三级99| 欧美成人免费全部观看天天性色| 亚洲少妇最新在线视频| 欧美国产一区二区三区激情无套| 亚洲欧美另类中文字幕| 亚洲欧洲精品一区二区三区不卡| 国产精品一区免费视频| 欧美老女人xx| 老司机免费视频一区二区| 亚洲欧美日韩国产一区二区三区| 亚洲第一在线综合在线|