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

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>
            老司机免费视频一区二区| 亚洲一区二区精品| 国产精品扒开腿做爽爽爽软件| 欧美综合国产| 久久精品一区二区三区不卡牛牛 | 欧美日韩亚洲在线| 欧美日韩国产成人在线91| 亚洲视频网站在线观看| 久久er99精品| 免费成人美女女| 欧美激情精品久久久久久| 亚洲欧洲一区二区三区在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲黄色视屏| 亚洲欧美日韩国产| 久久久久久久97| 欧美激情综合网| 国产麻豆日韩欧美久久| 一区二区在线免费观看| 99精品热6080yy久久| 欧美在线电影| 亚洲国产精品va在线看黑人动漫| 99在线|亚洲一区二区| 欧美一区二区三区视频免费播放| 玖玖国产精品视频| 国产精品v亚洲精品v日韩精品| 国产午夜精品理论片a级大结局| 亚洲大胆女人| 午夜精品免费视频| 91久久综合| 亚洲砖区区免费| 国产精品成人免费视频 | 午夜日本精品| 欧美成人亚洲| 国产欧美日韩三区| 99在线热播精品免费| 久久午夜精品| 中文一区二区| 欧美精品国产精品| 久久久久久久久蜜桃| 国产精品theporn| 亚洲欧美精品在线| 久久久久久9| 国产精品五月天| 亚洲精品视频一区| 久久综合狠狠综合久久综青草| 一区二区日韩伦理片| 欧美福利影院| 亚洲国产成人91精品| 久久久久一区二区三区四区| 在线亚洲精品| 欧美日韩在线视频一区二区| 亚洲精品久久久久中文字幕欢迎你| 久久久人成影片一区二区三区观看| 日韩视频一区二区| 欧美高清在线播放| 久久久久久国产精品mv| 一区二区三区国产精华| 欧美成人一品| 91久久国产综合久久| 欧美xxx成人| 久久综合久久综合九色| 91久久在线观看| 欧美mv日韩mv国产网站| 牛夜精品久久久久久久99黑人| 国产日韩欧美综合精品| 亚洲制服丝袜在线| 中文久久乱码一区二区| 国产精品99免费看 | 香蕉成人久久| 亚洲永久免费观看| 国产精品网站在线观看| 久久久精品日韩欧美| 久久大逼视频| 亚洲国产精品黑人久久久| 亚洲高清久久久| 欧美日本免费一区二区三区| 亚洲视频成人| 午夜精品久久久久久99热软件| 国产午夜精品全部视频在线播放| 欧美中文字幕视频| 久久er99精品| 日韩亚洲视频在线| 中日韩在线视频| 国产一区二区在线观看免费播放| 久久久噜噜噜久久| 欧美大片在线观看一区| 制服诱惑一区二区| 欧美一区二区三区电影在线观看| 在线播放豆国产99亚洲| 亚洲激情成人网| 国产精品女人网站| 免费黄网站欧美| 欧美日韩在线高清| 久久综合色88| 欧美三区在线视频| 久久久久久亚洲精品中文字幕 | 国产美女精品人人做人人爽| 麻豆精品一区二区综合av | 国产亚洲在线观看| 亚洲成人在线网| 国产精品日韩高清| 亚洲电影毛片| 狠色狠色综合久久| 这里只有精品丝袜| 国产欧美视频一区二区三区| 欧美日韩亚洲91| 99视频精品全部免费在线| 亚洲美女av黄| 欧美成人精精品一区二区频| 一区二区三区欧美视频| 久久gogo国模啪啪人体图| 99精品国产在热久久| 久久激情视频久久| 午夜国产精品视频免费体验区| 久久精品导航| 久久精品二区亚洲w码| 国产精品爱啪在线线免费观看| 欧美激情bt| 精品91免费| 欧美一区二区三区男人的天堂| 亚洲影院在线观看| 欧美另类在线播放| 亚洲国产天堂网精品网站| 黄色精品一区| 久久av一区二区三区漫画| 久久福利精品| 国产女主播在线一区二区| 一区二区三区免费网站| 一本久久综合| 欧美精品久久久久久| 欧美激情在线观看| 亚洲级视频在线观看免费1级| 久久久久国产免费免费| 久久午夜av| 伊人影院久久| 老司机aⅴ在线精品导航| 美日韩精品视频| 亚洲第一精品夜夜躁人人爽| 久久久久久夜精品精品免费| 另类天堂av| 1000精品久久久久久久久| 久久久久久久一区| 欧美成人有码| 日韩午夜电影在线观看| 欧美激情一区二区三区在线| 最近中文字幕mv在线一区二区三区四区| 1024国产精品| 欧美成人视屏| 日韩视频在线观看| 亚洲男女自偷自拍| 国产精品扒开腿爽爽爽视频 | 久久国产精品久久久| 久久精品亚洲| 亚洲成人影音| 欧美精品日韩综合在线| 日韩午夜剧场| 欧美一级视频| 在线精品一区二区| 欧美精品久久99久久在免费线| 日韩亚洲欧美中文三级| 欧美一区二视频在线免费观看| 国产午夜精品一区理论片飘花 | 国产精品一区二区女厕厕| 性久久久久久| 欧美va天堂| 亚洲私人影吧| 国产亚洲午夜| 欧美日韩免费一区| 欧美一区二区成人6969| 亚洲高清毛片| 亚洲精品国偷自产在线99热| 亚洲精品欧美日韩| 欧美视频三区在线播放| 欧美一区激情| 日韩网站在线| 欧美成人亚洲成人日韩成人| 亚洲视频一区二区| 狠狠色香婷婷久久亚洲精品| 欧美日本在线播放| 久久国产精彩视频| 中日韩男男gay无套| 欧美激情视频一区二区三区不卡| 亚洲一区999| 亚洲国产你懂的| 国产日韩av一区二区| 欧美人与性动交a欧美精品| 欧美一区二区三区四区在线观看| 亚洲精品国产精品乱码不99| 久久嫩草精品久久久精品一| 亚洲欧美久久久| 夜夜躁日日躁狠狠久久88av| 国内精品久久久久影院薰衣草| 欧美日韩激情小视频| 免费看成人av| 久久精品视频免费| 午夜精品久久久久久久久久久| 亚洲欧洲精品天堂一级| 欧美成人一区二免费视频软件| 久久精品国产免费|