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

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>
            欧美伊人久久大香线蕉综合69| 久久久久久9| 国产毛片精品国产一区二区三区| 欧美小视频在线观看| 久久国产一区二区| 国产美女精品一区二区三区| 国产精品尤物| 国内精品久久久久影院 日本资源| 国产综合久久久久影院| 黄色亚洲在线| 亚洲精品偷拍| 亚洲欧美一区在线| 久久www成人_看片免费不卡| 久久亚洲欧美| 亚洲欧洲日本一区二区三区| 日韩西西人体444www| 亚洲一区欧美| 久久另类ts人妖一区二区| 欧美另类人妖| 国产亚洲欧洲| 一区二区三区四区五区精品| 欧美在线影院| 亚洲精品免费观看| 欧美一区综合| 欧美日一区二区在线观看| 国产在线观看精品一区二区三区| 亚洲日本电影| 久久久在线视频| 亚洲网站在线| 欧美精品亚洲二区| 亚洲高清色综合| 久久黄色网页| 亚洲一区二区三区午夜| 欧美精品自拍| 91久久夜色精品国产九色| 久久国产免费看| 亚洲深夜激情| 欧美日韩黄色大片| 亚洲精品少妇30p| 嫩草伊人久久精品少妇av杨幂| 亚洲主播在线| 国产精品女人毛片| 亚洲午夜精品在线| 亚洲六月丁香色婷婷综合久久| 蜜臀久久久99精品久久久久久 | 欧美日韩国产系列| 亚洲国产精品成人| 久久久久国产一区二区| 亚洲欧美成人一区二区在线电影| 欧美日韩精品一区二区三区四区 | 欧美一级网站| 一区二区三区国产在线| 欧美成熟视频| 91久久精品美女高潮| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲女同在线| 国产麻豆91精品| 欧美在线观看视频一区二区三区| 亚洲欧美日韩精品| 国产日韩专区| 亚洲欧美日韩精品一区二区| 国产欧美精品一区二区色综合| 亚洲一区二区三区高清 | 亚洲国内自拍| 欧美精品www| 在线一区二区三区做爰视频网站| 亚洲美女区一区| 国产精品第一区| 性色av香蕉一区二区| 欧美一区二区三区播放老司机| 国产资源精品在线观看| 欧美不卡在线视频| 欧美成人影音| 亚洲在线观看| 欧美在线播放| 亚洲人成网站777色婷婷| 亚洲电影视频在线| 欧美日韩美女| 久久国产日本精品| 另类av导航| 亚洲尤物影院| 久久精品视频一| 一本色道久久| 欧美一区二区三区免费观看| 亚洲高清影视| 亚洲网站在线播放| 亚洲激情视频在线播放| 亚洲一级二级| 亚洲韩日在线| 亚洲宅男天堂在线观看无病毒| 激情一区二区三区| 亚洲精品永久免费| 国内精品美女在线观看| 亚洲精品久久久久中文字幕欢迎你 | 国产精品国内视频| 久久婷婷综合激情| 欧美日韩国产在线看| 久久久夜精品| 欧美三级欧美一级| 免费永久网站黄欧美| 欧美午夜三级| 欧美成人中文字幕| 国产精品视频男人的天堂| 欧美大片一区二区| 国产日韩欧美不卡| 99国产精品视频免费观看| 狠狠做深爱婷婷久久综合一区| 日韩午夜三级在线| 亚洲精品美女久久久久| 校园春色国产精品| 亚洲午夜小视频| 模特精品在线| 久久综合给合久久狠狠狠97色69| 欧美色道久久88综合亚洲精品| 乱中年女人伦av一区二区| 国产精品久久久一区二区三区| 亚洲电影免费观看高清| 影音国产精品| 久久国产精品亚洲77777| 亚洲免费中文字幕| 欧美不卡在线视频| 亚洲欧美日韩国产中文| 国产精品一区二区久激情瑜伽| 欧美韩日一区| 国内精品久久久久影院薰衣草| 亚洲天堂成人| 中文一区字幕| 欧美日韩国产在线一区| 亚洲精品一区二区网址| 一区二区av在线| 欧美另类专区| 99re66热这里只有精品3直播| 日韩亚洲欧美在线观看| 欧美顶级少妇做爰| 亚洲激情视频在线观看| 91久久精品国产91性色| 欧美成人免费一级人片100| 欧美激情2020午夜免费观看| 亚洲电影免费在线| 免费久久久一本精品久久区| 亚洲第一精品福利| 日韩视频在线免费| 欧美另类在线观看| 亚洲午夜激情网站| 久久精品视频在线看| 国产婷婷色一区二区三区在线| 欧美一级精品大片| 免费久久99精品国产自| 亚洲人成高清| 国产精品高潮呻吟久久av无限| 亚洲视频一起| 久久久久久久成人| …久久精品99久久香蕉国产| 欧美激情第三页| 一区二区三区 在线观看视频| 午夜精品一区二区在线观看| 国产日韩精品在线| 老司机午夜免费精品视频| 日韩视频永久免费| 欧美在线精品一区| 亚洲激情成人在线| 欧美日韩一区在线播放| 午夜精品久久久久| 欧美国产先锋| 午夜久久一区| 亚洲电影成人| 国产精品欧美一区喷水| 久久综合伊人77777麻豆| 99精品欧美一区| 美女图片一区二区| 亚洲专区欧美专区| 在线精品观看| 国产精品日韩欧美一区二区| 久久夜精品va视频免费观看| 亚洲日本免费电影| 久久久999精品免费| 亚洲精品中文字幕在线| 国产日韩欧美在线| 欧美日韩成人综合天天影院| 久久精品国产99国产精品澳门| 亚洲精品久久久久久久久久久久| 久久久久99精品国产片| 亚洲深爱激情| 亚洲国产欧美一区二区三区同亚洲 | 午夜视频一区二区| 在线播放视频一区| 国产精品午夜视频| 欧美激情中文不卡| 久久精品主播| 午夜精品久久99蜜桃的功能介绍| 伊人久久大香线蕉综合热线 | 亚洲福利国产| 久久精品国产99精品国产亚洲性色| 最新亚洲视频| 黄色成人精品网站| 国产欧美 在线欧美| 国产精品国码视频| 欧美日韩亚洲一区二区三区在线| 久久亚洲私人国产精品va| 欧美一区二区三区久久精品 |