`

事件委托(delegate)

 
阅读更多
委托机制的本质就是调用成员函数的函数指针,实现回调

委托就是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值.委托可以看作是对函数的抽象,是函数的"类".委托的实例将代表一个具体的函数.

一个委托可以搭载多个方法,所有方法被依次唤起.它可以使得委托对象所搭载的方法并不需要属于同一个类.但委托对象所搭载的所有方法必须具有相同的原形和形式.

https://blog.csdn.net/xgx198831/article/details/47171539

#include <iostream>
#include <vector>
using namespace std;

class A{
public:
    void fun(){
        cout << "fun" << endl;
    }
};

class B{
public:
    void fun(int i){
        cout << "B::fun " << i << endl;
    }
};

class C{
public:
    void fun(int i){
        cout << "C::fun " << i << endl;
    }
};

void fun2(int i){
    cout << "fun2:" << i << endl;
}

template<typename T>
class DelegateHandler
{

public:
    DelegateHandler(T* pT, void (T::*pFun)()):
          mT(pT), mFun(pFun) { }

    void invoke()
    {
        (mT->*mFun)();
    }

private:
    T* mT;
    void (T::*mFun)();
};

//none member fun
template<>
class DelegateHandler<void>
{
public:
    DelegateHandler(void (*pFun)(int))
    {
        mFun = pFun;
    }
    void invoke(int i)
    {
        mFun(i);
    }

private:
    void (*mFun)(int);
};

class DelegateHandlerInterface
 {
public:
    virtual ~DelegateHandlerInterface(){ }
    virtual void invoke(int i) = 0;
};

template<typename T>
class DelegateHandlerImpl1: public DelegateHandlerInterface
 {
public:
    DelegateHandlerImpl1(T* pT, void (T::*pFun)(int)):
          mT(pT), mFun(pFun) { }
    virtual void invoke(int i){
        (mT->*mFun)(i);
    }
private:
    T* mT;
    void (T::*mFun)(int);
};

int main()
{
    A a;
    DelegateHandler<A> af(&a,&A::fun);
    af.invoke();
    DelegateHandler<void> vf(&fun2);
    vf.invoke(3);

    B b;
    C c;
    vector<DelegateHandlerInterface*> v;
    DelegateHandlerImpl1<B> impl1(&b,&B::fun);
    DelegateHandlerImpl1<C> impl2(&c,&C::fun);
    v.push_back(&impl1);
    v.push_back(&impl2);
    for (auto it = v.cbegin(); it != v.cend(); ++it) {
        (*it)->invoke(7);
    }
}



fun
fun2:3
B::fun 7
C::fun 7


分享到:
评论

相关推荐

    委托delegate invoke的简单源代码,适合委托初学者!

    委托delegate invoke的简单源代码,适合委托初学者!

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....

    delegate委托

    从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个...

    .Net C#委托 delegate

    本ppt结合场景和实例对C#委托(delegate)的基础进行了讲解:包括了委托的定义,基本语法,同步异步调用,匿名委托的使用,泛型委托,lamda表达式,剖析了委托协变、委托逆变。对委托在.net 3.5框架中的身影进行了分析...

    事件委托 event delegate

    主要通过进度条进行解释 利用委托将界面和业务层分离的方法

    C#中的事件和委托(Delegate,Event)

    C#中的事件和委托(Delegate,Event)

    C#由浅至深深度解析Delegate委托与Event事件

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就...

    .Net的异步机制(委托Delegate)

    使用.Net 的委托机制来为我们的程序提供异步操作行为. ...public delegate string AsyncEventHandler(string name); 2步,使用委托提供的BeginInvoke, EndInvoke 方法(具体使用下一篇文章详细介绍)来提供异步的调用...

    c#中关于委托delegate的经典的实例

    c#中关于委托delegate的经典的实例,可以使我们清楚的了解delegate的使用方法及含义。

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    01.C# 知识回顾 - 委托 delegate.pdf

    01.C# 知识回顾 - 委托 delegate.pdf 01.C# 知识回顾 - 委托 delegate.pdf

    02.C# 知识回顾 - 委托 delegate续.pdf

    02.C# 知识回顾 - 委托 delegate续.pdf02.C# 知识回顾 - 委托 delegate续.pdf

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下: 关于Delegate【代理、委托】是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名...

    QT中QTableView加载自定义Modle和自定义委托Delegate

    QT自定义模型Modle的实现实例和自定义委托Delegate的实现实例以及在QTableView中加载使用的实现

    CSharp_Delegate C#委托

    CSharp_Delegate C#委托 本人博客中的示例代码

    解析.Net 4.0 中委托delegate的使用详解

    但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针;而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法...

    preact-dom-delegate:实现preact的dom事件委托

    preact-dom-delegate实现 preact 的 dom 事件委托只支持 preact 8,Preact X 可以使用安装$ npm i -S preact-dom-delegate使用说明在 JSX DOM 上设置 on 属性,值为委托处理方法,该方法会传入一个委托对象 delegate...

    多线程,Delegate 委托带参数的方法

    Delegate '委托,带参数的方法,多线程,可以轻松在线程中传递参数,获取返回值.

    delegate 委托 示例 代码

    委托的简单理解: 参考了一些资料整合起来 写了个小程序,使您能充分理解和使用————delegate ,委托

Global site tag (gtag.js) - Google Analytics