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

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++

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲欧洲视频在线| 在线亚洲观看| 欧美日韩一区二区三区在线观看免 | 欧美与黑人午夜性猛交久久久| 亚洲一区免费视频| 激情欧美一区二区三区在线观看| 亚洲综合第一| 亚洲第一综合天堂另类专| 99re这里只有精品6| 麻豆国产精品777777在线 | 久久天天狠狠| 国产一区二区三区电影在线观看 | 欧美视频一区二区| 欧美成人精品一区二区三区| 久久嫩草精品久久久精品一| 亚洲黄页一区| 一区二区欧美在线| 亚洲人精品午夜在线观看| 国产亚洲午夜| 国产精品视频你懂的| 免费试看一区| 一区二区三区av| 欧美日本高清一区| 欧美在线三级| 欧美在线观看视频一区二区三区| 欧美va亚洲va国产综合| 亚洲视频一区二区在线观看 | 国产精品久久久久久av福利软件| 一本到12不卡视频在线dvd| 亚洲午夜激情网站| 伊人春色精品| 日韩亚洲综合在线| 日韩视频一区二区三区| 国产精品99久久99久久久二8| 国产精品99久久久久久久女警 | 久久久国产成人精品| 性做久久久久久免费观看欧美| 亚洲欧美另类在线观看| 日韩性生活视频| 亚洲老司机av| 亚洲一区网站| 亚洲激情社区| 亚洲人成人一区二区三区| 99re热这里只有精品免费视频| 亚洲视频自拍偷拍| 午夜精品久久久| 欧美一区二区三区另类| 欧美一区二区三区四区视频| 久久er99精品| 小黄鸭精品aⅴ导航网站入口| 亚洲精品社区| 老司机aⅴ在线精品导航| 欧美成人精品影院| 亚洲狼人综合| 欧美一级视频一区二区| 牛人盗摄一区二区三区视频| 国产精品99免费看| 亚洲精品乱码| 亚洲国产综合在线看不卡| 亚洲精品黄网在线观看| 欧美影院在线播放| 欧美精品一区二区视频| 欧美日产在线观看| 亚洲国产日韩在线一区模特| 亚洲欧美国产va在线影院| 久久美女性网| av成人天堂| 国产乱码精品一区二区三区忘忧草| 欧美日韩午夜在线视频| 一区二区三区蜜桃网| 亚洲婷婷综合久久一本伊一区| 亚洲永久免费视频| 国产在线观看精品一区二区三区 | 国产精品成人在线| 中文在线一区| 午夜激情一区| 欧美激情自拍| 亚洲自啪免费| 亚欧成人在线| 亚洲国产精品va在线观看黑人 | 欧美精品二区三区四区免费看视频| 国内成人自拍视频| 欧美在线看片| 久久夜色精品国产亚洲aⅴ| 国产综合在线看| 欧美成人四级电影| 亚洲国产免费| 亚洲国产精品一区二区www| 国产精品扒开腿做爽爽爽视频 | 性欧美精品高清| 久久久蜜桃精品| 亚洲一区久久久| 欧美一区二区女人| 午夜精品区一区二区三| 久久久久国产精品午夜一区| 久久精品国产一区二区三| 欧美在线视频免费观看| 亚洲一区bb| 你懂的一区二区| 中文欧美日韩| 麻豆精品视频在线观看| 久久人人看视频| 国产精品视频第一区| 亚洲黄色天堂| 激情文学一区| 亚洲国产精品专区久久| 国语自产精品视频在线看| 宅男噜噜噜66一区二区| 亚洲在线网站| 欧美精品一区视频| 日韩视频中文字幕| 亚洲激情精品| 久久综合99re88久久爱| 国产精品自拍一区| 久久精品国产欧美激情| 91久久久精品| 裸体一区二区三区| 亚洲欧洲日产国产综合网| 亚洲少妇自拍| 久久岛国电影| 国产精品入口麻豆原神| 久久全国免费视频| 亚洲区一区二| 亚洲欧美在线观看| 亚洲一级在线观看| 在线看日韩av| 国产一区二区日韩精品| 欧美午夜一区二区福利视频| 欧美电影在线观看完整版| 亚洲欧美日韩另类| 中文一区字幕| 午夜精品久久久久久久99樱桃| 亚洲人成7777| 久久精品免费播放| 欧美高清在线精品一区| 亚洲一区二区精品在线观看| 99精品福利视频| 亚洲精品影视在线观看| 亚洲电影av在线| 国产一区二区三区的电影 | 一区二区三区日韩欧美| 精品999在线播放| 欧美久久久久免费| 久久精品国产综合精品| 欧美国产精品人人做人人爱| 欧美日韩网址| 欧美ed2k| 国产精品日韩| 一区二区日韩伦理片| 亚洲美女精品久久| 中文在线不卡视频| 久久激情视频| 一本色道久久综合亚洲精品婷婷 | 久久九九电影| 久久精品主播| 亚洲国产精品成人久久综合一区 | 欧美黄色成人网| 欧美中文字幕视频在线观看| 老司机久久99久久精品播放免费| 亚洲欧洲一区二区三区在线观看| 欧美黄免费看| 亚洲伊人伊色伊影伊综合网| 亚洲欧洲美洲综合色网| 一区二区精品国产| 噜噜噜噜噜久久久久久91 | 久久aⅴ国产欧美74aaa| 久久免费精品日本久久中文字幕| 国产精品女人网站| 亚洲精选中文字幕| 亚洲天堂av图片| 亚洲欧洲综合另类| 亚洲女人天堂av| 欧美日韩视频| 亚洲欧美日韩第一区| 日韩亚洲综合在线| 欧美日韩精品免费| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品99久久久久久宅男 | 亚洲免费视频在线观看| 免费视频亚洲| 国产亚洲人成a一在线v站| 久久久另类综合| 日韩一级精品视频在线观看| 久久亚洲一区二区三区四区| 亚洲国产精品久久久久| 亚洲肉体裸体xxxx137| 蜜臀av在线播放一区二区三区| 夜夜爽av福利精品导航| 欧美中文字幕在线播放| 亚洲福利电影| 亚洲福利久久| 欧美日韩一级片在线观看| 一本色道久久综合狠狠躁篇怎么玩 | 在线免费精品视频| 久久精品国产第一区二区三区最新章节 | 免费成人高清| 亚洲国产精品悠悠久久琪琪 | 亚洲欧美综合一区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲三级毛片|