当前位置: 首页 > news >正文

崇左市网站建设_网站建设公司_网站建设_seo优化

网站主机 流量,视频拍摄脚本模板,搜索引擎优化的定义是什么,做家教在哪个网站#x1f680; 优质资源分享 #x1f680; 学习路线指引#xff08;点击解锁#xff09;知识定位人群定位#x1f9e1; Python实战微信订餐小程序 #x1f9e1;进阶级本课程是python flask微信小程序的完美结合#xff0c;从项目搭建到腾讯云部署上线#xff0c;打造一… 优质资源分享 学习路线指引点击解锁知识定位人群定位 Python实战微信订餐小程序 进阶级本课程是python flask微信小程序的完美结合从项目搭建到腾讯云部署上线打造一个全栈订餐系统。Python量化交易实战入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 介绍 这是很久之前的一个项目了最近刚好有些时间就来总结一下吧 推荐初步熟悉项目后阅读本文 https://gitee.com/smalldyy/easy-msg-cpp 从何而来 这要从我从事Qt开发的那些日子说起了项目说大不大说小也不小人倒是一茬又一茬需求也换了又换后来的事情大家都懂了项目变成了一坨浓Shit且不说其中的设计、构架、以及需求问题单说说我对这个项目的直观感受在我看来整个程序仿佛一颗大树从某点作为根然后一直向上延伸在没有足够时间重构的情况下它的层级越来越深这时候问题来了如果想让树木的两个不同分支的叶子节点发生关系事情就马上会变得十分痛苦 这两个想要联系的对象根本不再一个地方我可能要将其中一个对象的指针在这颗大树的节点上倒退3层然后再前进2层才能让他们见面然后暗戳戳的写下一个connect。 这时候我就想如果有一个专门的通信组件负责传递各种消息让两个对象中间产生一个媒介作为他们通信的桥梁获取这件事情就会变得更加轻松了我不用再费尽心思的将两个对象引用到同一个作用域甚至还要考虑哪个作用域更加合理。 诚然如果在前期就对项目的各个组件进行全盘规划我想这种困境可能不会或者很少出现但是并非所有事情都会按照美好的方向前进就如曾经堆在我面前的那坨浓Shit尽管我也为它的存在出过不少力………… 设计目标 提供C对象进程内通信功能 可进行消息传递将已经存在的结构体定义为消息时不能破坏已经存在的结构体本身的结构处理消息的类无需继承任何基类足够简单的订阅方法RAII形式的取消订阅但也支持手动取消订阅。 你可能注意到了我特意强调了不破坏原有结构。目的很简单就是为了保证项目不会因为引入这个组件而发生太大的变化。众所周知大部分程序员都是懒癌晚期如果引入一个组件会导致工作量激增程序员就会开始衡量shit的臭味和工作量之间的关系了。 总之核心特征只有两个易用改动小。 原理分析 我首先将这个组件设计为一个基于订阅分发方式的通信组件它有三个主要角色订阅者发布者和消息。 首先考虑最简单的发布者发布者的功能非常直观——发送消息也就是说用户只要在需要的位置调用一个sendMsg之类的函数即可这个函数的功能就是将用户给定的消息发送出去。 然后便是订阅者我们要求订阅的宿主类型不可以继承任何基类这个要求决定了我们订阅的方式我们需要提供一个函数它接受一个对象的指针我称之为宿主和它的成员函数将两者包装成一个std::function将这个包装好的回调函数与一个定义好的消息关联并记录下来这就形成了订阅关系。 当发布者发送消息时我们的组件需要查询订阅关系找到消息对应的回调函数将消息作为参数调用它此时对象间就完成了一次通信。我们的组件就是信使这样就无需发信人四处奔波了。 我们还要求不破坏原本的结构体的结构这也就意味着我们不能改动已经存在的结构体比如果让它继承一个消息基类然后就能作为消息传递之类的操作——虽然很好但是我们得对这个设计说拜拜了。但是上树订阅分发的流程必然要求消息拥有一个统一的基类类型否则我们无法统一回调函数的函数签名存储订阅关系也就无从谈起了因为参数类型不同的函数是很难存储到一个容器中以供查询的 为了解决这个闹人的问题我们不妨反向思考一下既然我们不能让一个已经存在的消息结构继承我们的基类那么就创建一个新的类型同时继承两者吧 class NewExistMsg : public ExistMsg, public em::EasyMsg 用户可以使用 NewExistMsg 来创建消息体就像使用 ExistMsg一样回调函数可以使用EasyMsg*作为参数来达到类型的统一并可以安全的进行多态设计。 至此消息的问题也解决了。 你可能会感兴趣的技术细节 以下是EasyMsg的头文件 class EASYMSG\_API EasyMsg { public:EasyMsg();virtual ~EasyMsg() default;virtual std::string id() const 0;template typename T struct is\_easymsg {template typename U static char test(typename U::MsgType *x);template typename U static long test(U *x);static const bool value sizeof(test(0)) 1;};// c17 support constexpr if #if ((defined(\_MSVC\_LANG) \_MSVC\_LANG 201703L) || \_\_cplusplus 201703L)template typename EASY\_MSG\_ID bool match() {is\_easymsg test\_easymsg;if constexpr (test\_easymsg.value) { // c17return id() EASY\_MSG\_ID::value;} else {std::cerr 匹配消息ID时发生错误检查是否使用了未定义的消息 检查: typeid(EASY\_MSG\_ID).name() std::endl;return false;}} #elsetemplate class MSGIDtypename std::enable\_if::value, bool::type match() {std::cerr 匹配消息ID时发生错误检查是否使用了未定义的消息 typeinfo : typeid(MSGID).name() std::endl;return false;}template class MSGIDtypename std::enable\_if::value, bool::type match() {return id() MSGID::value;}#endif }; 这里边有一些有意思的东西可以学习一下首先映入眼帘的就像是经典的虚析构函数这是作为多态基类的必要手续。接下来就是SFINAE的经典用法我是用这个技巧实现了match函数这个函数的主要作用就是判断给定的EASY_MSG_ID是否和传入的消息指针是同一种消息类型。 match根据c标准分成了两个实现C17版本借助了 constexpr if特性。以前的版本则用了经典的std::enable_if。 对SFINAE不甚了解的人应该很难理解这些代码SFINAE中文含义为“匹配失败不是错误”这对模板变成来说非常重要不过这已经超出了本文范围我仅仅是抛砖引玉之后我可能会更新文章对此段代码进行详解从而让大家了解这些惯用法。 其他的便没有什么技术细节了都是些常规的东西无非是用map记录下订阅关系然后send时执行回调之类的东西不值细说。 结论 本文向大家介绍了一个侵入性较低的C对象间通信组件或许可以帮助你解决一些头疼的通信问题并展示了一些你可能感兴趣的技术细节如果能引发更多的思考那就更好不过了
http://www.ihoyoo.com/news/36885.html

相关文章:

  • 安徽网站建设大全网页制作与网站建设技术大全 pdf
  • 仿所有网站苏州保洁公司招聘
  • dw做的网站要多大专业网站seo推广
  • 广州番禺网站公司哪家好响应式网站字体大小
  • 耿马网站建设网站文件权限设置
  • 铭泰东莞网站建设策划书平台建设部分
  • 网站运营有哪些岗位创同盟做网站好不好
  • 大连网站开发公司整合网络营销策划
  • 天津网站优化微信小程序制作网站
  • php 网站开发文档怎么写蛋糕店网站源码
  • aliyun怎么建网站iis禁止通过ip访问网站
  • 企业门户网站建设的必要性免费查公司的网站
  • 湖南衡阳网站建设alexa排名是什么意思
  • 做网站的用什么电脑好韵博工业设计
  • 免费自助建站网站一览自助建站平台wordpress图片变形
  • 2021年最新的网站可信赖的商城网站建设
  • iis 建设网站黑人做爰视频免费网站
  • dz系统怎么做地方网站wordpress register位置
  • 做一款网站网页游戏大厅在线玩
  • 深圳网站建设方维网络黄石网站建设哪家专业
  • 一个备案可以做几个网站友好链接
  • 淘宝客合伙人网站建设微信官方商城小程序
  • 没有网站的域名对做网站有什么建议
  • 网站屏幕自适应wordpress 改成宽屏
  • 北京网站案例wap免费空间
  • 网站不备案可以建设吗新闻资讯网站怎么做
  • 洛阳孟津网站建设大学英文网站建设
  • 建筑资源网站做旅游销售网站平台ppt模板
  • 网站运营需要做什么宁化县建设局网站
  • 实训课网站开发个人小结给企业做网站的公司有哪些