(C++进阶)boost库笔记

目录

1、boost::function

1.1 概述

1.2 boost包装器和C++11包装器对比

1.2、代码示例


1、boost::function

1.1 概述

boost::function 是 Boost 库中提供的一个通用函数对象包装器,它可以存储指向任何可调用对象的指针,并且可以在任何时候通过 operator() 调用。这个功能类似于C++11及以后版本中的 std::function。使用 boost::function 的主要好处是可以创建类型安全的函数指针容器,可以接受不同类型的函数、成员函数、lambda 表达式或仿函数(functor)作为参数,方便在算法和数据结构中传递可调用实体。

1.2 boost包装器和C++11包装器对比

C++11和Boost库中的包装器在概念上具有相似之处,都是为了提供对可调用实体(如函数、函数指针、成员函数指针、lambda表达式以及仿函数等)的通用接口。但是它们的具体实现、依赖性以及功能细节有所不同。

相同之处:

1. 目的:两者都提供了将不同类型的可调用对象统一为一个类型安全的接口的能力,以便在需要可调用对象的地方进行传递和使用。

2. 灵活性:无论是C++11标准库中的std::function还是Boost库中的boost::function,都能存储不同类型和数量参数的可调用对象。

3. 适配器模式:它们都作为适配器模式的一种应用,允许用户以一致的方式处理多种不同的调用机制。

不同之处:

1. 标准支持:std::function是C++11及更高版本的标准库部分,不需要额外安装库即可使用;而boost::function来自Boost库,这是一个第三方开源库,需要独立安装才能在项目中使用。

2. 语法和API:虽然功能类似,但具体的声明和使用的API语法略有不同。如:在C++11中使用std::function<void(int)> f;,而在Boost中则是boost::function<void (int)> f;。

3. 性能与兼容性:由于std::function是标准库的一部分,它通常会随着编译器和标准库的更新得到更好的优化和支持。而Boost::function可能在某些旧版编译器或平台上提供更多兼容性支持。

4. 设计细节:两个类模板的内部实现细节可能有所差异,包括内存管理策略、效率表现等。随着时间推移,C++标准库的实现可能会吸取Boost库的优点并进行改进。

5. 依赖关系:如果项目仅支持C++11及以上版本,并且希望避免外部库依赖,那么std::function是首选。反之,对于早期不支持C++11的环境或者已经集成Boost库的项目,boost::function可以提供类似的便利。

6. 其他特性:除了基本的功能外,Boost库还可能包含更多相关辅助工具或扩展功能,比如与Boost.Lambda、Boost.Bind等库配合时有更丰富的功能集成。而C++11及以后的标准库本身也引入了lambda表达式和右值引用等特性,使得函数对象的创建和使用更加方便直接。

1.2、代码示例

#include <boost/function.hpp>

void free_function(int x)
 {
    std::cout << "Free function called with: " << x << std::endl;
}

struct MyFunctor 
{
    void operator()(int x) const {
        std::cout << "Functor called with: " << x << std::endl;
    }
};

int main() 
{
    boost::function<void (int)> func;
    // 绑定自由函数
    func = &free_function;
    func(10);
    // 绑定成员函数
    MyFunctor functor;
    func = boost::bind(&MyFunctor::operator(), &functor, _1);
    func(20);
    // 绑定lambda表达式
    func = [](int x){ std::cout << "Lambda called with: " << x << std::endl; };
    func(30);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/458529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ET框架新起一个服务及实现服务之间的消息通讯

1.配置文件StartSceneConfig 2. SceneFactory switch (scene.SceneType) {case SceneType.Activity:break; } 定义SceneType枚举类型 public enum SceneType: uint {Activity 66, } 3.在InnerMessage.proto文件中定义消息 //ResponseType Activity2Other_Test message Ot…

Unity3d Shader篇(十五)— 激光扫描效果

文章目录 前言一、什么是X射线或激光扫描效果&#xff1f;1. X射线或激光扫描效果原理2. X射线或激光扫描效果优缺点优点&#xff1a;缺点&#xff1a; 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四…

Labelme

文章目录 前言一、遇到问题二、排查问题1.分析问题2.验证问题2.1对比两者&#xff0c;格式是一致的&#xff0c;唯一不同之处是imagePath 不一样&#xff0c;labelme 生成的是图片的名称&#xff0c;不包含路径&#xff1b;而自动生成的是完整路径的图片名称。2.2再次思考两者的…

elasticsearch8.12 分词器安装

分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 分词器下载地址 analysis-ik Releases infinilabs/analysis-ik GitHub 一个简便 安装方式 安装完成之后 会提示重启&#xff0c;重启es即可 ./bin/elasticsearch-pl…

【AI论文阅读笔记】ResNet残差网络

论文地址&#xff1a;https://arxiv.org/abs/1512.03385 摘要 重新定义了网络的学习方式 让网络直接学习输入信息与输出信息的差异(即残差) 比赛第一名1 介绍 不同级别的特征可以通过网络堆叠的方式来进行丰富 梯度爆炸、梯度消失解决办法&#xff1a;1.网络参数的初始标准化…

C++ 拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1. 引入 2. 拷贝构造的概念 3. 浅拷贝 4. 深拷贝 二. C运算符重载 1. 概念 2. 注意事项 3.举例 一. 拷贝构造函数 1. 引入 我们在创建对象时&#xff0c;能不能创建一个与原先对象一模一样的新对象呢&#xff1f;为了解决这个问题&#x…

C++——类和对象(2)

1. 类的6个默认成员函数 当一个类中什么都没有&#xff0c;编译器会帮类自动生成6个默认成员函数例如&#xff1a; class Date {}; 此篇文章主要围绕构造函数与析构函数进行讲解。 2. 构造函数 2.1 概念 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> usi…

如何零基础入门Prometheus

本公众号的精品教程《玩转Prometheus监控》是一套零基础的入门教程&#xff0c;基于多年实战经验编写而成&#xff0c;内容完整覆盖了产品的核心技术要点&#xff0c;适合想入门和进阶技术的朋友学习。 整个系列总共24篇课程&#xff0c;由基础知识开始&#xff0c;逐步进阶学…

复现文件上传漏洞

一、搭建upload-labs环境 将下载好的upload-labs的压缩包&#xff0c;将此压缩包解压到WWW中&#xff0c;并将名称修改为upload&#xff0c;同时也要在upload文件中建立一个upload的文件。 然后在浏览器网址栏输入&#xff1a;127.0.0.1/upload进入靶场。 第一关 选择上传文件…

webpack5零基础入门-8清空前次打包文件与处理图标字体资源

1.配置output中的clean属性为true output: {/**文件输出路径 绝对路径*///__dirname 表示当前文件的文件夹目录path: path.resolve(__dirname, dist),//所有文件的输出目录/**文件名 */filename: static/js/dist.js,//入口文件输出文件名clean: true,//在打包前将path整个目录内…

【学习笔记】红队视角下的windows应急响应

1. 上线的方法 exe上线→开360晶核的情况比较困难 2&#xff09;白加黑 接下来的讲解就是基于白加黑上线&#xff0c;看如何应对应急 2. 演示 360环境启动 shell whoami →死 -beacon 如何去查杀 看外联&#xff1a; netstat -ano 提取IP 威胁情报api调用→查是否是恶意…

【Qt】QListView 显示富文本,设置文本内容颜色

【Qt】QListView 显示富文本&#xff0c;设置文本内容颜色 文章目录 I - 控件使用II - 显示富文本III - 注意事项 I - 控件使用 Qt 的 MVC 架构为 MV &#xff0c;Controller 部分继承到了 View 里&#xff0c;View(视图) 设置 Model(模型)&#xff0c;Model 设置数据 这里使用…

设备维修带来的无限价值——易点易动设备管理系统的优势

在化工工厂中&#xff0c;设备的正常运行是保障生产顺利进行的关键。然而&#xff0c;设备难免会出现故障和损坏&#xff0c;而及时有效的设备维修对于提高生产效率和降低成本至关重要。为了解决这一问题&#xff0c;易点易动设备管理系统应运而生&#xff0c;以其卓越的功能和…

TEASEL: A transformer-based speech-prefixed language model

文章目录 TEASEL&#xff1a;一种基于Transformer的语音前缀语言模型文章信息研究目的研究内容研究方法1.总体框图2.BERT-style Language Models&#xff08;基准模型&#xff09;3.Speech Module3.1Speech Temporal Encoder3.2Lightweight Attentive Aggregation (LAA) 4.训练…

前端实例:页面布局1(后端数据实现)

效果图 注&#xff1a;这里用到后端语言php&#xff08;页面是.php文件&#xff09;,提取纯html也可以用 inemployee_index.php <?php include(includes/session.inc); $Title _(内部员工首页); $ViewTopic 内部员工首页; $BookMark 内部员工首页; include(includes/…

vue3动态组件未渲染问题

渲染问题 component动态组件写法与vue2写法一致&#xff0c;代码如下&#xff1a; <component :is"componentName"/><script setup>import { ref } from vueimport account from ./user/account.vue// 组件名称const componentName ref(account)// 点击…

Linux arrch64系统架构 py文件运行时的编码问题解决

问题&#xff1a; 因为要测试一些东西&#xff0c;所以必须有中文数据来做支撑&#xff0c;之前用的架构是x86&#xff0c;现在一个服务器的架构为arrch64&#xff0c;下列编码都挨个都进行声明&#xff0c;但是无法解决问题&#xff0c;总是报错 # -*- coding: gbk -*- # -*…

数组的大小与元素的个数

一、数组的大小 数组一旦声明&#xff0c;大小就确定了&#xff0c;无论元素是否填充 以大括号声明的数组&#xff0c;数组大小和大括号中元素的数量是一致的 以双引号字符串声明的字符数组&#xff0c;数组大小比字符的个数多一个 sizeof(数组名)得到的是元素类型所占字节…

一行代码极速部署:打造面向开发者的流计算平台

作者&#xff1a;Yingjun Wu TL;DR. curl https://risingwave.com/sh | sh在2021年初&#xff0c;我创立了RisingWave&#xff0c;目标是推广流计算技术的普及。在过去的三年中&#xff0c;我不断的向市场布道RisingWave&#xff0c;希望RisingWave能够在流计算这一市场中占…

精简版 Obsidian 图床配置 PicGo+ gitee

精简版 Obsidian 图床配置 PicGo gitee 图床的作用 图床&#xff08;Image Hosting Service&#xff09;是一种在线服务&#xff0c;用于存储和托管用户上传的图片文件。用户可以将图片上传到图床服务器&#xff0c;并获得一个可访问的图片链接&#xff0c;然后可以在网页、博…
最新文章