理解C++实现委托原理

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

      在C#中有事件委托的概念,  我们可以方便的将一个类中的事件传递到另一个事件处理类中, 其实现的耦合性很底, 两个类之间不需要实例关联,  但在C++中并没有这种内置的功能,  其实仔细想想, C#的这种事件委托机制是可以用C++的成员函数指针来实现的, 只需要加上一个中间类即可,  网上有个FastDelegate的开源库就实现了这种委托机制, 有需要用到C++委托的朋友可以上网找找这个库.  我们这里只是简单介绍下C++实现委托机制的原理, 也是参照了FastDelegate库.

      前面说过, 要实现C++委托, 需要一个中间类, 这个中间类是用来保存函数指针和例实例的, 因为要实现通用性, 所以我们还需要用到C++模板技术, 定义的类如下:

     在这个中间类里, 我们重载了()操作符来调用成员函数指针,  然后我们还需要一个函数来创建中间类:

 

     现在主要的代码就完成了, 接下来我们看看调用方式:

      可以看出, 调用方式是非常简单的,  另外, 对于带参数的成员函数, 原理也是一样的, 具体的可参照FastDelegate自己实现

C++下实现委托的代码 C++下实现委托的代码,利用了些编程技巧和大家分享~~ 立即下载

相关推荐

c++实现委托和事件

使用c++的function和bind实现c#中的委托和事件

高效C++委托的原理

写这篇学习心得源自于一篇老外的文章Member Function Pointers and the Fastest Possible C++ Delegates,网上也有它对应的中文翻译,我随意找一篇:http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html。 文章中提到了高效C++委托,不过讲得太生涩了,以至于第一次看,没怎么

程勇新的专栏 5582

c++实现委托

NULL 博文链接:https://mengdejun.iteye.com/blog/934849

C#委托传递给C++函数指针

C#委托传递给C++函数指针 原创作者游蓝海,转载请注明出处 最近在Unity中集成一些C++库,跨语言交互的时候遇到了一个坑——不能直接将extern方法的参数声明为委托类型。 因为将方法作为参数传递的时候,C#会自动创建一个临时的委托对象,然后将委托对象的指针传入C++。由于委托对象是临时的,在垃圾回收的时候回会被回收掉,导致C++端的函数指针就变成野指针了。因此,在传递委托参数的时候,需要自...

游蓝海 的专栏 5006

图形化界面无限转圈?CentOS 7的SELinux避坑指南(附命令行修复实录)

本文详细解析了CentOS 7图形界面启动时无限转圈或卡在'starting switch root'的故障原因,主要与SELinux安全策略冲突有关。提供了三种修复方案:临时禁用SELinux、重装策略包和精细调整策略,并分享了长期维护建议,帮助用户平衡系统安全性与可用性。

potato的博客 798

AD20 Channel-Offset Error 解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法一、问题现象二、解决办法 前言 AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法 一、问题现象 我们经常在使用Room格式快速布局相同模块电路时出现以下问题, 二、解决办法 相同模块电路PCB布局复制的过程网上有很多,这里不再做赘述,步骤都差不多,只说问题根源; 1:.

m0_47201213的博客 7621

在 C/C++ 中实现委托(delegate)

  相信使用过C#语言的人们,对于委托应该是记忆深刻,委托具有很多不错的特性,但最令人感到兴奋的是它可以简化很多复杂的开发同时具有低耦合与对象闭包的特性。    委托在C/C++中可以解决最直观的就有问题,一个是相同代码签名的成员函数与全局函数可以被一个委托调用的问题,在C/C++语言中我们在不借助委托的前提下,代码很难在不增加耦合与依赖的情况调用它们(无论这个依赖是隐式的还是显式的都会存在这个...

liulilittle的博客 1万+

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

C++笔记-16-委托机制的实现

C++笔记-16-委托机制的实现 在C#中,有完善的委托可以存储成员函数。但是在C++中,我们需要自己利用C++特性去实现委托。 首先,我们要解决的问题就是如何存储成员函数指针,此外,对于每一个成员函数指针,他都需要一个类对象去调用它 此外,考虑到全局函数,他的存储方法又和成员函数不同,因此我们需要通过抽象类实现类型存储的多态化。 思路解读 委托抽象类 第一步,我们需要一个抽象类,作为任意委托类型的基类 class IDelegate { public: virtual ~IDelegate() {

韩天衣的博客 2268

TensorFlow2深度学习实战(十四):目标检测算法 YOLOv4 解析

最易上手的【计算机视觉】小白教程!

不积跬步,无以至千里! 7632

uniapp - 实现集成调用zebra斑马打印机+打印标签+打印二维码详细实例代码,通过蓝牙连接打印机打印与通过打印机IP和端口两种方式适配斑马打印机(全平台兼容H5、微信小程序、苹果安卓App)

uniapp适配斑马打印机 实现标签打印,uniapp适配斑马打印机实现标签打印,uniapp调用zebra斑马打印机打印标签,uniApp连接传统蓝牙的斑马打印机打印,实现标签打印功能uniapp 蓝牙连接斑马打印机发送zpl指令打印,适配斑马(Zebra)牌打印机,小程序调用蓝牙打印机完整代码,uniapp 打印机wifi链接 蓝牙链接,uniapp斑马打印机,实现二维码标签展示以及打印,APP端连接打印机打印小票和标签,uniapp使用斑马打印中文不出来,打印机连接不上,打印没反应怎么办,打印报错,斑

🏆 前端领域优质创作者 1万+

C++实现委托机制(一)

如果你接触过C#,你就会觉得C#中的delegate(委托)十分灵巧,它的用法上和C\C++的函数指针很像,但是却又比C\C++的函数指针更加灵活。并且委托可以一对多,也就是可以注册多个函数,甚至是某个类的非静态成员函数。而实现事件消息机制【1】也十分依赖于委托机制。基于这样的目的,我们试着在C++上封装出这样的一个委托机制。

YzlCoder的记事本 2万+

CAPL诊断功能实现

UDS(Unified Diagnostic Services)是一种用于汽车电子系统诊断的标准协议。它定义了一系列诊断服务,用于读取和写入车辆电子控制单元(ECU)中的数据,以及处理诊断故障码(DTC)。UDS协议通常运行在CAN总线上,使用ISO 15765-2(ISO-TP)协议进行数据传输。通过本文的学习,读者应该对CAPL诊断功能实现有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1516

C++之委托构造函数实例(二百四十三)

本篇目的:理解C++之委托构造函数用法。委托构造函数是C++11引入的一个特性,允许某个构造函数在初始化列表中调用同一个类中的其他构造函数。这样可以避免代码重复,提高代码的可维护性和重用性。在C++中,一个类可以有多个构造函数,每个构造函数负责初始化对象的不同部分或者提供不同的参数选项。在某些情况下,多个构造函数会有一些共同的初始化代码,这就会导致代码冗余。委托构造函数解决了这个问题,让一个构造函数可以重用其他构造函数的初始化代码。

Android系统攻城狮 432

FPGA+CUYSB3014实现USB3.0功能

CYUSB3014是赛普拉斯在近几年推出的新一代USB3.0的外设控制器,可以解决USB2.0带宽限制,或者单独开发USB协议和驱动的难题。赛普拉斯将CYUSB3014简称为EZ-USB FX3,具有高度的灵活特性,开发人员只需要下载FX3的固件库,就能使用USB3.0的功能。目前在一些电子产品中,使用主控器加PHY芯片最流行的方式是用FPGA+FX3这种搭配来实现USB3.0接口。......

D_Katter的博客 7065

FPGA&ASIC笔面试题(四):编写Verilog代码描述跨时钟域信号传输,快时钟域到慢时钟域(补充)

      跨时钟域处理从快时钟域到慢时钟域,如果是下面第一个图,cklb则可以采样到signal_a_in,但是如果只有单脉冲,如第二个图,则不能确保采样掉signal_a_in。这个时候用两级触发器同步是没有用的。 代码如下: //Synchronous module Sync_Pulse( input clka, input clkb, input rst_n, input pulse_ina, output pulse_outb, ou

千歌叹尽执夏的博客 2509

我所理解的委托和匿名函数

委托和匿名函数在我们的日常编程中用得非常多,甚至有些同学用了大半年的匿名函数,却对其本质不甚了解,就像我们天天都要呼吸空气,却对空气质量和成分却没清晰的认识。委托和匿名函数虽然使用起来非常方便,但由于使用者理解不够深刻,不假思索地使用带来更多的是内存泄漏和过多的垃圾产生。那么这里,笔者就用一种他所理解的方式来给大家挖挖委托匿名函数的原理,让大家看看为什么这家伙用起来这么容易让人上瘾。

UWA—简单优化,优化简单! 1371

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

function&bind原理总结。

首先要搞懂两个东西的原理你必须要要知道委托,对C++模板有深入的了解。委托:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。 如果要详细了解委托 ,请看下面链接: http://baike.baidu.com/link?url=Ja8bMBM

u011488256的博客 2420

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++11 常用的新特性

本篇介绍C++11标准对比之前C++标准的新特性,C++11为C++语言在2011年发布的版本,它改进幅度很大,影响至今。如加入auto 关键字、nullptr、移动语义(move semantics)、委托构造函数(delegating constructors)、默认构造函数(default constructor)、类型别名(type alias)、右值引用(rvalue reference)、Lambda 表达式(lambda expressions)、静态断言等。

Bobowen的博客 3259

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JVM的CAS实现原理解析

目前java的集合框架中引入了轻量级锁来实现并发,所以理解CAS的实现,对于正确使用java并发框架非常重要,本文蜻蜓点水大概了解下CAS的实现,不详细分析每一行代码,主要这种分析CAS实现的大概细节,有关指针,汇编的细节,还请参考相关书籍,不正确地方指出,还望指出。 一 、 CAS的JNI Java入口类概述 在sun.misc包中,有这样一个类,Unsafe.java,这是java调用轻量

lwg040814025的博客 2389

如何动态保存不同类的对象的成员函数的地址?--解决(续)

 我现在用我自己研究的方法写了一个类(见下面源码),与上面提到的文章的类比较有下面一些不同:1,底层关键的实现我用了memcpy,他利用union结构(这也导致我的功能的薄弱)。2,我的类的一个对象可以添加多个函数,可以实现统一的调用,而他的类的一个对象绑定一个函数,但很灵活。(这都是可以改的)3,我的类的功能弱,遇到函数所属的类有继承,虚函数,多重继承时就不对了,只适用单一无继承的类函数;而他的

benny5609的专栏 820

模拟面试系列-ClassLoader

摘要:面试者小强在面试中被问及JVM类加载机制,虽能回答双亲委派的基础概念,但面对Tomcat破坏双亲委派的原因及自定义核心类加载等深入问题时表现不足。同事老汪指出其问题在于仅死记硬背而缺乏源码级理解,并给出三点学习建议:研读ClassLoader.loadClass源码、分析Tomcat的WebappClassLoader实现、查看OpenJDK的bootstrapclassloader初始化列表。最后通过真实线上故障案例,强调深入理解类加载机制对解决实际问题的重要性。

程序员小星星的博客 246

Java 中的引导类加载器(Bootstrap ClassLoader) 详解

原生实现:由 C/C++ 编写,非 Java 类。核心职责:加载 JVM 运行所需的核心类库。委托模型:作为类加载器层次结构的顶端,确保类加载的顺序和唯一性。不可见性:在 Java 中表现为null,无法直接操作。从底层看,它是 JVM 启动的关键组件;从源代码看,它通过 JNI 与 Java 的体系协作,共同完成类的动态加载。理解引导类加载器不仅有助于深入掌握 JVM 内部机制,还能更好地调试类加载相关问题(如上面的内容不太易于理解,因此我下面用更加通俗易懂的解释,方便读者理解。

goTsHgo的博客 1557

深入理解C#委托及原理

一、委托 设想,如果我们写了一个厨师做菜方法用来做菜,里面有 拿菜、切菜、配菜、炒菜 四个环节,但编写此方法代码的人想让 配菜 这个环节让调用方法的人实现,换句话说,就是想在方法被调用时接收 代码 作为参数,在方法中执行这端传进来的代码。 但,怎么为一个方法传 代码 进来呢?当然大家想到了传递接口方式来实现,咱先不讨论接口,因为微软为我们提供了一个叫做 【委托】 的类型。 (一)、委托基础: 1.先看看代码: (1).定一个方法:void SayHi(string name){Console.WriteLi

VisageNocturne的博客 1097

C# 委托原理、事件原理刨析和对比

C# 委托原理刨析,和事件原理刨析,外加两者对比,应该是目前全网讲的最细的帖子了吧。从委托介绍=》基本使用=》框架应用=》原理分析=》事件原理分析=》两者对比

Bob的博客 861
上一篇: 理解C++成员函数指针
下一篇: Ubuntu 10.04 用Wine完美运行QQ 2009
study_live
博客等级 码龄19年 20粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值