boost库学习总结

2023-05-16

第一次使用boost库是因为网络编程,由于时间比较紧,没有时间每个库都学,所以前期想找个专门的boost库网络教程(以前自己就用过socket写过,但是为了跨平台,而且boost库这么好,还是趁早学吧)。终于在网上找到一个很好的boost库教程系列。 http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/?pg=1
  1. boost库IOS版本的framework下载和使用地址:https://github.com/mz2/boostoniphone。之所以用framework是因为IOS设备和IOS模拟器使用的boost库是不一样的,一个是嵌入式设备版本,另外一个就是MAC OS版本,为了解决IOS设备与模拟器之间的调试差异,使用framework最好不过了。

  2. resolver的异步查询(async_resolve)让我搞了1个小时,虽然教程上说根据说明文档很容易使用async_resolve,但是实际编写时就遇到问题了。
    bug:异步完成句柄被调用时始终传入error。
    但从网上查资料,基本跟我写的一样啊,没什么区别。最后各种尝试,终于找出里面的原因来了。
    解决方法:io_service必须要在socket,resolver初始化之后才能调用run()函数,否则异步查询始终出错。

  3. scoped_ptr:确保指针的所有者只有一个(当然你不应该将原生指针赋给多个scoped_ptr对象),即scoped_ptr本身不能被scoped_ptr类型构造或者赋值。而且由于将原生指针封装成类,可就成了异常安全类型了。并且scoped_ptr很适合用于有多个分支的函数,例如一开始申请一块缓冲区,多个分支函数可能直接返回,在返回之前我们一般都需要删除这块内存,此时我们可以使用scoped_ptr去指向这块刚申请的内存。这样我们就不用显示释放了。这个方案相比于使用goto语句结构更清晰,更安全。

  4. scoped_array:它和scoped_ptr几乎一模一样,除了多提供了operator[]函数,使其能像一般数组一样访问对应元素。scoped_array一般用于当数组元素固定的时候(个人认为如果固定的话,除非每个元素大小很大,否则直接使用局部变量比较好)。动态的数组分配,如果对效率没有非常苛刻的要求的话,建议还是使用std::vector。

  5. shared_ptr
    1. 在看到boost部分源码的时候对其构造函数比较好奇,为了构造函数还使用偏特化模版函数。即
      template<typename T> class shared_ptr {
        public:
          template <class Y> explicit shared_ptr(Y* p);
      .....
      };
      原来shared_ptr也可以这样使用。
      boost::shared_ptr< void > p( new std::string( "HelloWorld" );
      这样就隐藏了智能指针p的真实指针类型。但shared_ptr保证能正确表用std::~string析构函数(内部肯定记录了)。

    2. 这种设计其实背后有很大文章。由于shared_ptr设计中也考虑到兼容以前代码,所以我们可以从shared_ptr获取原生指针,但如果用户使用原生指针删除了动态分配的对象怎么办?
      我们可以采用这种模式:
      class A {
      public:
        virtual void sing()=0;
      protected:
        virtual ~A() {};
      };
      
      class B : public A {
      public:
        virtual void sing() {
          std::cout << "Do re mi fa so la";
        }
      };

      基类的析构函数是protected,所以基类指针是不能调用delete。派生类的是public自然就可以删除了。有了上面的设计,在加上shared_ptr的模版参数和构造参数可以不同这个特点,就可以解决方面的问题了,如:
      boost::shared_ptr<A> createA() {
        boost::shared_ptr<A> p(new B());
        return p;
      }

      通过此函数创建出来的shared_ptr,其get()返回的指针是无法被删除的(当然你强制转换除外)。所以可以放心的把shared_ptr::get()函数返回的指针给需要原生指针的函数使用。

  6. polymorphic_cast
    这是一个dynamic_cast的特殊版,由于dynamic_cast对指针转换失败和引用转换失败结果不一致,polymorphic_cast决心将其改正,也就是当指针类型转换失败的时候也抛出异常,但是polymorphic_cast不能用于引用类型。个人感觉有点“拗口”。不过书中也提了利用将指针转换成引用来实现指针转换失败时采用像引用转换失败的策略(即抛出异常)。由于现在水平有限,不能很好地体会到大师用意。

  7. polymorphic_downcast
    这是非常好的工具,一个在debug环境下按照dynamic_cast流程走,以方便调试。但是在release环境下按照static_cast流程走,提高效率。当然前提是你确保传入的类型按原本的意图是指传一种已知的类型,即这个模版函数适用于,原来强制类型转换的地方(特别是预防以后可能传入错误类型的情况)。

  8. numeric_cast
    是个使用的工具,让我们平时粗心的转换得到更多安全的保障。

  9. lexical_cast
    一个让字符串和其他类型之间的转换更“美好“的工具。原理类似与stringstream。用户自定义的类,只要满足operator<<就能被lexical_cast转换。如果满足operator>>就能接受lexical_cast的转换结果。

  10. BOOST_STATIC_CAST
    一个能在编译阶段确定某模版参数是某一类型的宏定义。唉,我们日常生活自己编写模版类的实践太少,看来中国和最先进的C++水平还是有不少差距啊。

  11. checked_delete
    一个能保证被delete的对象所属类,在该函数调用处,已经有完整信息。即编译器有类的足够信息,以可以正常调用该对象类的析构函数。这种情况很少,但是大师的任务是,杜绝一切可能,提供最牢靠的”防御“。

  12. noncopyable
    一个在很多类框架中都能看到,而且自己也接触的模式,就是提供一个不可复制的基类。让派生类以私有形式(共有形式也可以,但是在设计角度不够好)派生该基类。以表达此类具有不可复制的属性。

  13. address_of
    一个能确保取到变量地址的模版函数,及时这个变量所属的类重载了取址操作符(&),此函数也能够取到真正地址。

  14. enable_if, disable_if
    一个能让某些模版函数或者类加入或者排除在候选重载函数中。牛,我只能说,大师做的事情已经跟我们不一个级别了。目前还没遇到过这种情况,但是我相信,如果没有看到《Beyond the C++ Standard Library: An Introduction to Boost》,一定会很迷茫。

  15. operator

    operators头文件中包含了很多有便扩展操作符重载的解决方案,就像书中写的,如果我们提供operator<,那么我么应该提供operator<=,>=,>等操作符,但是其实我们发现,通过opertor<我们能够推出operator<=,operator>=,operator>等操作符,但是我们却往往忽略,或者怕出错误,以至于我们类的操作符重载不够“友好”,用户使用不能像预想的那样。opertors库,让这些依赖于主操作符重载的辅操作符重载更简单,而且更加概念化,系统化。通过派生于less_than_comparable<typename T>,我们就能实现比较,通过其他概念,我们将更加简单而且清晰的实现各类应该具备的操作符。

  16. regular expression

    相信做过文本文件读取,或者各类工具的编程爱好者,一定对于正则表达式十分的向往(如果有高效,易用的正则表达式,那么很多应用将得心应手)。相信boost::regex可以给你带来希望。基本上是用使用regex需要3部分:需要被处理的源文本字符串,匹配结果,正则表达式。通过regex的三大算法(regex_match,regex_search,regex_replace),我们能实现各种应用,而且还有其他很多如regex_token_iterator等使用操作,让regex非常好用。但是regex是个很大的库,里面包含的知识和应用十分庞大,具体的还是需要参考document,这个章节只是一个很好的引导者。

  17. any

    这个类提供了像shared_ptr一样的功能:能够包含任意类型。但是any不是一个模板类。所以我们可以在stl的容器中使用其作为类型参数,这样我们就可以实现在stl容器中包含任意类型的目的了。any中的any_cast是其精髓,想要访问any中的实例都需要这个接口去获得新的实例拷贝。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost库学习总结 的相关文章

  • 使用c++对阿里云OSS SDK进行封装,实现查询文件夹、上传文件、下载文件到内存和本地路径下等功能,并附赠进度条

    最近工作中遇到需要将文件上传到阿里云的oss服务器上 xff0c 所以根据阿里云的说明文档 xff0c 封装了一个类 xff0c 希望对大家有所帮助 xff0c 如发现问题 xff0c 欢迎批评指正 主要功能 xff1a 1 设置连接池数
  • CAN2.0B 数据帧详解

    CAN的帧类型分为数据帧 遥控帧 错误帧 过载帧以及帧间空隙 xff0c 本文将对数据帧的帧结构展开说明 xff1a 引言 xff1a CAN2 0协议分为A版本和B版本 xff0c A版本协议为11位标识符 xff08 标准帧 xff09
  • window下c/c++异步发送udp和非阻塞的方式接收udp的类封装

    以下代码对udp发送和接收都做了封装 xff0c 在发送和接收前都需要去注册使用的功能 xff0c 从而做到需要哪个模块才启动哪个模块的功能 xff0c 避免资源的浪费 udp发送功能 使用列表和信号量的方式实现异步发送数据 xff0c 避
  • c/c++使用libhdfs对HDFS(Hadoop分布式文件系统)进行读写操作

    最近需要对HDFS进行读写操作 xff0c 参考hdfs h头文件里面的注解 xff0c 编写了一个例子 详细的说明在代码的注释中 如发现问题欢迎批评指正 span class token macro property span class
  • 使用c/c++将十六进制的stl字符串转换成IEEE - 754 浮点数

    span class token keyword typedef span span class token keyword union span span class token punctuation span span class t
  • 使用 C++ 处理 JSON 数据交换格式

    使用 C 43 43 处理 JSON 数据交换格式 一 摘要 JSON 的全称为 xff1a JavaScript Object Notation xff0c 顾名思义 xff0c JSON 是用于标记 Javascript 对象的 xff
  • C++ -- 智能指针( C++11与boost库的智能指针及其使用)

    1 智能指针的引入 1 在动态内存管理中 xff0c 如果new上一块空间 xff0c 但是没有delete xff0c 就会产生内存泄露的问题 2 但是有时候 xff0c 我们new了 xff0c 也delete了 xff0c 但是还会出
  • 动态库与静态库区别

    首先 xff0c 两者最重要的区别在于该库是否被编译进目标程序当中 静态库 xff1a 该库在编译的时候会直接整合到目标程序当中 xff0c 也就是说 xff0c 每个程序的静态库都是独立的 这样使得文件比较大 而且因为是编译的的时候整合进
  • 解决ubuntu20.04虚拟机无法上网的问题

    64 linux虚拟机无法正常上网 前言 刚建立好的linux虚拟机使用NAT方式可以连接外网 xff0c 系统重启几次 xff0c 系统无法上网 xff0c 这是什么问题导致的呢 xff1f 提示 xff1a 以下是本篇文章正文内容 xf
  • Arduino系列教程之 – PWM的秘密

    转载地址 xff1a http www diy robots com p 61 814 感谢作者的翻译 PWM是啥玩意儿 xff1f PWM是 怕玩命 的缩写 xff0c 英文写法是 Pulse width modulation xff0c
  • YOLOv2代码分析_读取labels[by zhangzexuan]

    YOLOv2代码分析 读取labels by zhangzexuan YOLOv2代码分析 读取labelsby zhangzexuan YOLOv2的输入代码阅读 嗯 现在参与的项目要求在人脸检测步骤直接连同人脸特征点一起预测出来 xff
  • 【企业微信】获取token & 发送应用消息

    企业微信获取token 存入redis 设置时长2小时 amp amp 发送企业应用消息接口 1 常量类 span class token keyword package span span class token namespace co
  • 学习笔记--HTTP-字段总结(一)-与传输实体相关的报文字段总结

    目录 一 概述 二 介绍一些常用字段 三 传输实体的一些属性 1 传输的数据类型 2 实体的语言类型和编码 3 编码类型 四 文件类型和压缩编码字段 1 Accept 2 Content Type 3 Accept Encoding 4 C
  • C/C++ 去掉宏定义__FILE__路径

    一 问题 在日志模块中往往带着文件信息 xff0c 有的源文件是加载其他路径下的源文件 xff0c 但是不想让别人看到文件路径信息 xff0c 只显示源文件的名字和行数即可 如下图所示 xff0c 有烦人的相对路径 二 解决方案 自定义一个
  • C语言提高(一)

    C语言提高 CS和BS的区别函数封装和数组形参退化为指针数据类型本质变量的本质内存分区模型全局区以文字常量区为例分析全局区 栈区堆区 函数的调用模型函数调用变量传递分析静态局部变量的使用栈地址的生长方向堆地址的生长方向内存的存放方向 以数组
  • ROS Gazebo(三):启动gazebo/URDF

    打开Gazebo的方式主要有两种 xff1a rosrun 和 roslaunch 1 启动ROS节点 启动ROS节点 bring up 机器人的标准工具是roslaunch 打开一个空的Gazebo世界命令如下 xff1a roslaun
  • Windows与Ubuntu之间通过网线传输文件

    一 windows与Ubuntu之间网线直连搭建局域网 把网线连好后 xff0c 在两个系统中做以下设置 Windows下的配置 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP I
  • Jetson TX2——CAN口的使用

    Jetson TX2 之CAN口的使用 TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com
  • Jetson TX2——串口的使用(TTL-RS485)

    Jetson TX2之串口的使用 xff08 TTL RS485 xff09 TX2串口设备 TX2 有5个 UARTs 到主连接器 其中UART3 用于 WLAN BT 有关 UARTs 的典型任务 请参见下表 查看可用串口设备 xff1
  • 面试题知识点全纪录---容器

    注意 xff1a 该博客仅是本人对掌握知识的测试 xff0c 具体内容请移步guide哥网站 xff01 xff01 xff01 https snailclimb gitee io javaguide 链接 JAVA集合框架 https w

随机推荐

  • 高并发-消息队列

    一 消息队列 消息队列在分布式系统中主要是为了解耦和削峰 什么是消息队列 我们可以把消息队列看作是一个存放消息的容器 xff0c 当我们需要使用消息的时候 xff0c 直接从容器中取出消息供自己使用即可 消息队列是分布式系统中重要的组件之一
  • Ublox-M8N GPS接收机UBX协议解析

    Ublox M8N GPS接收机UBX协议解析 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Java清空List方法

    1 用list clear 方法清空list xff1b 用此方法 xff0c 其它引用该list的值也会变成空 2 用list 61 null来清空list 3 new ArrayList 来清空list
  • fastjson用java转json时间的格式化

    一 项目中需求遇到需要接收其他应用数据 xff0c 通过 64 RequestBody注解接收参数后 xff0c 到本地利用fastJson把json格式化 需要注意一下几点 xff1a 需要在调用JSON toJSONString 的时候
  • 工具类里面调用service接口或者mapper接口

    我们在开发中经常会遇到需要将一些频繁进行的操作抽取封装到工具类中 xff0c springboot不支持注入静态属性 所以在工具类中使用 64 Autowired或者其他注解自动注入会失败 xff0c 才用如下方法这可以避免注入失败 spa
  • windows下停止【kill】nginx命令

    杀死nginx taskkill fi 34 imagename eq nginx EXE 34 f taskkill f t im nginx exe stop bat taskkill f t im nginx exe pause
  • 基本类型对应的缓冲池

    基本类型对应的缓冲池如下 xff1a boolean values true and false all byte values short values between 128 and 127 int values between 128
  • 记录JVM中Eden区、Survivor from区和Survivor to区及Minor GC和Major GC的理解

    仅做学习笔记 JVM中Eden区 Survivor from区和Survivor to区 本文主要根据 深入理解JVM 中内存回收策略 xff0c 主要关注如下五个方面 xff1a 1 xff1a Eden区分配 2 xff1a 大对象直接
  • ubuntu下修改python默认版本的方法

    Ubuntu安装之后会面临多个python版本共存的问题 xff08 python2和python3 xff09 xff0c 但是有时候安装其他库的时候会安装在默认的python版本环境下 xff08 比如 xff0c 通常默认版本是pyt
  • C++:C语言实现HTTP的GET和POST请求

    https www cnblogs com diligenceday p 6255788 html
  • Linux C/C++ UDP Socket 网络通信

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 昨晚 Vv 让
  • Xcode工程创建多个target

    Xcode工程创建多个target 小菜本人有时候会在一个Xcode工程中新建多个包含main函数的 m文件用于用于学习Objective C xff0c 于是要用到target这个东西 target对应于一个可运行文件和一些编译配置 点击
  • JLINK简介

    一 什么是JLINK JLINK是一个兼容JTAG的仿真器 xff0c 作用是烧入程序和Debug 二 JLINK是如何处理数据的 xff1f 1 PC端应用程序将数据以某种协议格式 xff0c 通过USB接口发送给J Link 2 J L
  • 蓝桥杯单片机-DS1302时钟模块

    一 简介 1 采用SPI三线接口通信 xff08 SCK SDA RST xff09 上升沿数据被写入DS1302 xff0c 下降沿被读出 二 应用 1 在ds1302 c文件中定义三个数组 unsigned char code READ
  • 蓝桥杯单片机-定时器

    一 简介 有三个寄存器与定时器相关 xff08 TMOD xff0c TCON xff0c 数值设置寄存器TH TL xff09 1 定时器工作方式设置寄存器TMOD GATE 门控制位 GATE 61 0时 定时器 计数器启动与停止仅受T
  • 蓝桥杯单片机-NE555模块

    一 简介 1 NE555在开发板中用于输出频率可变 xff0c 占空比不变的方波 2 NE555是纯硬件的设计 xff0c 通过电位器RB3可改变其信号输出频率 不需要编程实现其功能 考点 xff1a 使用定时器的计数模式测量NE555输出
  • C语言学习笔记(基于单片机)

    目录 一 关键字部分 static code const extern bit sbit sft struct xff08 结构体 xff09 1 结构体的初始化 2 结构体的赋值 3 应用 data idata pdata xdata 与
  • 蓝桥杯单片机-赛前总结

    目录 一 省赛中开发平台涉及的模块 xff1a 1 IIC驱动 2 DS1302驱动 3 onewire驱动 4 定时器读取NE555频率 二 一些功能性操作 1 外部中断 2 矩阵按键 3 PWM输出 4 毫秒延时函数 三 需要注意的一些
  • 相互依赖的so库,在编译时如何解耦

    有时候 xff0c 我们写的程序 xff0c 会涉及到相互引用的问题 比如frameworks av media libstagefright下的这个libstagefright xff0c 被frameworks av media lib
  • boost库学习总结

    第一次使用boost库是因为网络编程 xff0c 由于时间比较紧 xff0c 没有时间每个库都学 xff0c 所以前期想找个专门的boost库网络教程 xff08 以前自己就用过socket写过 xff0c 但是为了跨平台 xff0c 而且