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

1.1.C++项目:仿muduo库实现并发服务器之any类的设计

文章目录

  • 一、思想
  • 二、框架
  • 三、代码

一、思想

每⼀个Connection对连接进行管理,最终都不可避免需要涉及到应用层协议的处理,因此在Connection中需要设置协议处理的上下文来控制处理节奏。但是应用层协议千千万,为了降低耦度,这个协议接收解析上下文就不能有明显的协议倾向,它可以是任意协议的上下文信息,因此就需要⼀个通⽤的类型来保存各种不同的数据结构。
在C语言中,通用类型可以使用void*来管理,但是在C++中,boost库和C++17给我们提供了一个通用类型any来灵活使用,如果考虑增加代码的移植性,尽量减少第三方库的依赖,则可以使用C++17特性中的any,或者自己来实现。而这个any通用类型类的实现其实并不复杂,以下是简单的部分实现。

二、框架

/*Any类主要是实现⼀个通⽤类型出来,在c++17和boost库中都有现成的可以使⽤,但是这⾥实现⼀下
了解其思想,这样也就避免了第三⽅库的使⽤了*//*⾸先Any类肯定不能是⼀个模板类,否则编译的时候 Any<int> a, Any<float>b,需要传类型作
为模板参数,也就是说在使⽤的时候就要确定其类型*/
/*这是⾏不通的,因为保存在Content中的协议上下⽂,我们在定义any对象的时候是不知道他们的协
议类型的,因此⽆法传递类型作为模板参数*/
/*因此考虑Any内部设计⼀个模板容器holder类,可以保存各种类型数据*/
/*⽽因为在Any类中⽆法定义这个holder对象或指针,因为any也不知道这个类要保存什么类型的数
据,因此⽆法传递类型参数*/
/*所以,定义⼀个基类placehoder,让holder继承于placeholde,⽽Any类保存⽗类指针即可*/
/*当需要保存数据时,则new⼀个带有模板参数的⼦类holder对象出来保存数据,然后让Any类中的⽗
类指针,指向这个⼦类对象就搞定了*/

三、代码

class Any{private:class holder {public:virtual ~holder() {}virtual const std::type_info& type() = 0;virtual holder *clone() = 0;};template<class T>class placeholder: public holder {public:placeholder(const T &val): _val(val) {}// 获取子类对象保存的数据类型virtual const std::type_info& type() { return typeid(T); }// 针对当前的对象自身,克隆出一个新的子类对象virtual holder *clone() { return new placeholder(_val); }public:T _val;};holder *_content;public:Any():_content(NULL) {}template<class T>Any(const T &val):_content(new placeholder<T>(val)) {}Any(const Any &other):_content(other._content ? other._content->clone() : NULL) {}~Any() { delete _content; }Any &swap(Any &other) {std::swap(_content, other._content);return *this;}// 返回子类对象保存的数据的指针template<class T>T *get() {//想要获取的数据类型,必须和保存的数据类型一致assert(typeid(T) == _content->type());return &((placeholder<T>*)_content)->_val;}//赋值运算符的重载函数template<class T>Any& operator=(const T &val) {//为val构造一个临时的通用容器,然后与当前容器自身进行指针交换,临时对象释放的时候,原先保存的数据也就被释放Any(val).swap(*this);return *this;}Any& operator=(const Any &other) {Any(other).swap(*this);return *this;}
};

相关文章:

1.1.C++项目:仿muduo库实现并发服务器之any类的设计

文章目录 一、思想二、框架三、代码 一、思想 每⼀个Connection对连接进行管理&#xff0c;最终都不可避免需要涉及到应用层协议的处理&#xff0c;因此在Connection中需要设置协议处理的上下文来控制处理节奏。但是应用层协议千千万&#xff0c;为了降低耦度&#xff0c;这个…...

linux项目启动脚本start.sh和stop.sh停止脚本

start脚本示例 MAIN_CLASSCLASSPATH.;JVM_PARMS""export APP_HOME$(dirname $(pwd))export APP_APPS$APP_HOME/appsexport APP_RESOURCES$APP_HOME/confexport APP_LIB$APP_HOME/libexport APP_LOG$APP_HOME/logs;export APP_NAME$(basename $APP_HOME)function mak…...

Avalonia常用小控件Svg

1.项目下载地址&#xff1a;https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia&#xff0c;项目地址 https://github.com/irihitech/Semi.Avalonia 3.SVG库&#xff0c;Avalonia.Svg.Skia&#xff0c;项目地址 https://github.com/wieslawsoltes/Svg.Ski…...

设计模式-行为型模式

文章目录 一、模板方法模式二、策略模式三、命令模式四、责任链模式五、状态模式六、观察者模式七、中介者模式八、迭代器模式九、访问者模式十、备忘录模式十一、解释器模式 一、模板方法模式 定义一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中&#xff0…...

【EventLoop】问题一次搞定

&#x1f4cd; JS的事件循环机制恐怕是大多数前端开发者头顶上的一座大山之一&#xff0c;最近通过拜读两篇文档&#xff0c;对eventloop进行了深刻的理解&#xff1b;通过这篇文档对要点进行总结&#xff1b; article1&#xff1a; 波神的这篇eventLoop文章适合反复重温&…...

Unity中Shader光照模型Phong

文章目录 前言一、Phong光照模型二、图示解释Phone光照模型1、由图可得&#xff0c;R 可以由 -L 加上 P 得出2、P等于2*M3、因为 N 和 L 均为单位向量&#xff0c;所以 M 的模可以由 N 和 L得出4、得到M的模后&#xff0c;乘以 单位向量N&#xff0c;得到M5、最后得出 P 和 R 前…...

消息队列缓存,以蓝牙消息服务为例

前言 消息队列缓存&#xff0c;支持阻塞、非阻塞模式&#xff1b;支持协议、非协议模式 可自定义消息结构体数据内容 使用者只需设置一些宏定义、调用相应接口即可 这里我用蓝牙消息服务举例 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 原…...

MSF派生给另外MSF,meterpreter派生给另外meterpreter,Metasploit

首先是通过ms17_010永恒之蓝拿下shell,192.168.50.146为受害者靶机,192.168.50.130为kali的ip set autorunscript post/windows/manage/migrate nameservices.exe set payload windows/x64/meterpreter/reverse_tcp set lport 5577 set lhost 192.168.50.130 use exploit/windo…...

【LeetCode】1.两数之和

目录 1 问题2 答案2.1 枚举法 &#xff08;自己写的&#xff09;2.2 哈希表 3 问题 1 问题 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…...

3. Windows下C++/MFC调用hiredis库操作redis示例

一、头文件目录 将之前下载和编译好的Redis目录拷贝到新建好的工程目录下面&#xff0c;再点击测试工程的右键/属性&#xff0c;点击C/常规&#xff0c;附加包含目录添加以下路径&#xff0c;注意如果原先有多个路径&#xff0c;在末尾处添加分号后再粘贴&#xff1a; 点击C/常…...

200、使用默认 Exchange 实现 P2P 消息 之 消息生产者(发送消息) 和 消息消费者(消费消息)

RabbitMQ 工作机制图&#xff1a; Connection&#xff1a; 代表客户端&#xff08;包括消息生产者和消费者&#xff09;与RabbitMQ之间的连接。 Channel&#xff1a; 连接内部的Channel。channel&#xff1a;通道 Exchange&#xff1a; 充当消息交换机的组件。 Queue&#xff…...

SqlServer--get 和 post 请求 http接口

1. 开启 不开启报错 如下 4.1 SQL Server blocked access to procedure ‘sys.sp_OACreate’ sp_configure show advanced options, 1;GORECONFIGURE;GOsp_configure Ole Automation Procedures, 1;GORECONFIGURE;GO2. post Declare ServiceUrl nvarchar(MAX) Declare req_…...

利用人工智能提升企业培训的个性化体验

随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐渗透到各个领域。而在企业培训领域&#xff0c;人工智能也展现出了巨大的潜力。利用人工智能技术的企业培训系统&#xff0c;企业可以为员工提供个性化、高效的培训体验&#xff0c;进一步提升他们的专…...

基于JavaWeb的图书售卖网站(源码+部署+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于JavaWeb的图书售卖网…...

Java设计模式之代理模式

代理模式是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来控制对另一个对象的访问。代理模式在软件开发中经常被使用&#xff0c;它可以提供额外的功能&#xff0c;例如远程访问、延迟加载、访问控制和日志记录等。 代理模式涉及三个主要角色&#xff1a; 抽象…...

Oracle数据泵导入和导出命令

–管理员方式登录&#xff0c;新建表空间和用户&#xff0c;并建立文件夹映射路径并授权 CREATE DIRECTORY directory_name AS ‘path_to_directory’; grant read,write on directory directory to backup ** —EXPDP多线程备份数据库脚本–dblink–可以修改为命令行 echo …...

Linux中所有环境变量配置文件及用途

在Linux系统中&#xff0c;有多个文件可以用来配置环境变量&#xff0c;这些文件位于不同的目录和层级&#xff0c;并可以用于不同的目的。以下是一些常见的环境变量配置文件&#xff1a; 系统级环境变量文件&#xff1a; /etc/environment&#xff1a;这个文件包含了系统范围的…...

一文读懂flutter线程: 深入了解Flutter中的多线程编程

深入了解Flutter中的多线程编程 前言一、为什么需要多线程&#xff1f;二、在Flutter中创建线程三、多线程的最佳实践四、Flutter中的多线程示例五、Flutter中的多线程错误处理六、Flutter中的多线程性能优化七、安全性和隐私考虑八、跨平台性考虑 总结 前言 在移动应用开发领域…...

如何限制word文件中部分内容无法编辑

工作中我们经常会用到Word制作一些文件&#xff0c;文件中有一部分内容不想他人编辑&#xff0c;我们可以设置限制编辑&#xff0c;可以对一部分内容设置限制编辑&#xff0c;具体方法如下&#xff1a; 我们将需要将可以编辑的地方选中&#xff0c;然后打开限制编辑功能 然后勾…...

免疫球蛋白介绍

免疫球蛋白&#xff08;Immunoglobulin&#xff0c;Ig&#xff09;是广泛存在于哺乳动物血清、淋巴液、组织液和外分泌液中的一种具有抗体活性或化学结构与抗体相似的球蛋白&#xff0c;在机体防御疾病的重要成分在疾病研究、药物研发、疫苗评价中具有重要作用。抗体&#xff0…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...