boost函数对象

news2025/1/19 18:23:41

文章目录

    • bind
    • ref函数
    • Function
    • Lambda

本章介绍的是函数对象,可能称为’高阶函数’更为适合。 它实际上是指那些可以被传入到其它函数或是从其它函数返回的一类函数。 在C++中高阶函数是被实现为函数对象的,所以这个标题还是有意义的。

bind

和C++中的 std::bind()用法基本一致 现在更推荐用C++的bind函数 可以通过绑定函数的方式 去指定调用

#include <boost/bind.hpp> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

void add(int i, int j) 
{ 
  std::cout << i + j << std::endl; 
} 

int main() 
{ 
  std::vector<int> v; 
  v.push_back(1); 
  v.push_back(3); 
  v.push_back(2); 

  std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1)); 
} 

上面代码 将容器中的每个元素都加上10
第一个参数是常数值10,而第二个参数则是一个怪异的 _1。
_1 被称为占位符(placeholder),定义于 Boost.Bind。 除了 _1,Boost.Bind 还定义了 _2 和 _3。 通过使用这些占位符,boost::bind() 可以变为一元、二元或三元的函数。 对于 _1, boost::bind() 变成了一个一元函数 - 即只要求一个参数的函数。 这是必需的,因为 std::for_each() 正是要求一个一元函数作为其第三个参数。

当这个程序执行时,std::for_each() 对容器 v 中的第一个元素调用该一元函数。 元素的值通过占位符 _1 传入到一元函数中。 这个占位符和常数值被进一步传递到 add() 函数。 通过使用这种机制,std::for_each() 只看到了由 boost::bind() 所定义的一元函数。 而 boost::bind() 本身则只是调用了另一个函数,并将常数值或占位符作为参数传入给它。

ref函数

#include <boost/bind.hpp> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

void add(int i, int j, std::ostream &os) 
{ 
  os << i + j << std::endl; 
} 

int main() 
{ 
  std::vector<int> v; 
  v.push_back(1); 
  v.push_back(3); 
  v.push_back(2); 

  std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1, boost::ref(std::cout))); 
} 

不过这一次该函数需要一个流对象的引用来打印信息。 因为传给 boost::bind() 的参数是以值方式传递的,所以 std::cout 不能直接使用,否则该函数会试图创建它的一份拷贝。

通过使用模板函数 boost::ref(),象 std::cout 这样的流就可以被以引用方式传递,也就可以成功编译上面这个例子了。

原因:因为std::ostream对象不能被复制,只能被引用。 代码实际上在尝试做一件编译器不允许的事情:将非常量引用绑定到一个临时对象上(尽管在这个特定情况下,std::cout本身不是临时的,但问题的根源在于如何传递引用)。

boost::ref 是 Boost 库中的一个实用工具,它主要用于解决在函数对象作为参数传递时可能出现的拷贝代价过高、不希望拷贝对象或禁止拷贝对象的问题。boost::ref 可以将一个对象包装成一个引用,从而在传递参数时消除对象拷贝的代价,或者将不可拷贝的对象变为可以通过引用方式传递。

Function

C++也有这部分功能 用法如下

#include <functional>
#include <iostream>

using namespace std;

using customfun = function<int(const char*)>;

int func(const char* name)
{
	return strlen(name);
}

int main()
{
	customfun f= func;

	cout << f("misW") << endl;
}

在这里插入图片描述

boost 部分

#include <boost/function.hpp> 
#include <iostream> 
#include <cstdlib> 
#include <cstring> 

int main() 
{ 
  boost::function<int (const char*)> f = std::atoi; 
  std::cout << f("1609") << std::endl; 
  f = std::strlen; 
  std::cout << f("1609") << std::endl; 
} 

基本一致

Lambda

和C++部分基本一致 更推荐C++的用法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Jenkins部署项目

部署中的痛点 为什么要用Jenkins&#xff1f;我说下我以前开发的痛点&#xff0c;在一些中小型企业&#xff0c;每次开发一个项目完成后&#xff0c;需要打包部署&#xff0c;可能没有专门的运维人员&#xff0c;只能开发人员去把项目打成一个exe包&#xff0c;可能这个项目已…

淘宝图片搜索商品数据api接口对接详细的描述和解释

淘宝图片搜索商品数据接口是一项高级的API服务&#xff0c;它允许用户通过上传图片来搜索淘宝上的商品。这一功能依托于先进的图像识别技术&#xff0c;通过复杂的算法对上传的图片进行分析和处理&#xff0c;从而找到与图片相似的商品。以下是对该接口的详细描述和解释&#x…

Java避坑案例 - 忽略线程重用导致信息错乱

文章目录 Pre导读问题背景问题重现存在Bug的代码BUG现象 问题分析解决方案修正后的代码修正后的现象 ThreadLocal 的正确使用小结 Pre 并发编程-11线程安全策略之线程封闭 Spring JDBC-Spring事务管理之ThreadLocal基础知识 每日一博 - ThreadLocal VS InheritableThreadLoc…

忘记7-zip文件7-zip文件,还可以解压zip文件吗?

文件压缩与解压已成为我们日常处理数据和存储信息的常规操作。7-Zip&#xff0c;作为一款开源且功能强大的文件压缩工具&#xff0c;凭借其高压缩率、支持多种格式以及免费使用的特点&#xff0c;赢得了广大用户的青睐。然而&#xff0c;出于保护文件内容安全的考虑&#xff0c…

echart 采坑记录

1、刷新数据的时候使用setOption myChart.setOption(option,true); 第二个参数为true才会刷新数据 2、react引入ehcart&#xff0c;

[C++] 红黑树的实现:原理与底层解析

文章目录 [toc] 红黑树的概念红黑树的规则红黑树如何确保最长路径不超过最短路径的2倍红黑树规则最短路径与最长路径的分析最短路径&#xff1a;全黑路径最长路径&#xff1a;红黑交替路径 结论&#xff1a;红黑树的平衡性如何保障操作效率 红黑树的实现红黑树的节点结构红黑树…

【性能测试】jmeter通过定时器来模拟接口的动态请求时机

在 Apache JMeter 中使用定时器组件来模拟真实用户行为是非常重要的&#xff0c;因为这有助于确保你的性能测试结果更加贴近实际情况。 1. 固定定时器&#xff08;Constant Timer&#xff09; 这是最基础的定时器&#xff0c;用于在每个样本之间增加固定的时间延迟。然而&…

OpenCV-物体跟踪

文章目录 一、物体跟踪的定义二、OpenCV中的物体跟踪算法三、OpenCV物体跟踪的实现步骤四、代码实现五、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了丰富的功能来实现物体跟踪。以下是对OpenCV中物体跟踪的详细解释&#xff1a; 一、物体跟踪的…

微服务架构是如何运作的?

在当今的软件架构领域&#xff0c;微服务架构以其灵活性、可扩展性和高可用性等优势&#xff0c;受到了越来越多企业和开发者的青睐。那么&#xff0c;微服务架构究竟是如何运作的呢&#xff1f;让我们一起来深入了解。 一、微服务架构的基本概念 微服务架构是一种将单个应用…

QT开发--网络编程

第十七章 QT网络编程 Qt Network模块用于TCP/IP编程&#xff0c;提供HTTP请求、cookies、DNS等功能的C类。 使用需在pro文件中添加“QT network”。 tcp通信流程图 17.1 QHostInfo QHostInfo类用于查找主机名与IP地址的关联。它提供两种查找方式&#xff1a; 1、异步查找&…

windows10创建系统账户

方式一: .a.点击 windows 图标->设置 .b.点击账户 .c.点击其他账户->将其他人添加到这台电脑->弹出对话框 .d.选中用户->右键->新用户->输入用户名和密码->创建 如下创建完成 方式二&#xff1a; windows R 输入lusrmgr.msc 后续操作步骤同上。 修改用…

YOLO11改进|SPPF篇|引入FocalModulation特征金字塔

目录 一、【FocalModulation】特征金字塔1.1【FocalModulation】特征金字塔介绍1.2【FocalModulation】核心代码二、添加【FocalModulation】特征金字塔2.1STEP12.2STEP22.3STEP32.4STEP4三、yaml文件与运行3.1yaml文件3.2运行成功截图一、【FocalModulation】特征金字塔 1.1【…

Linux网络命令:用于配置防火墙规则的一个用户友好的工具ufw详解

目录 一、概述 二、安装 UFW 三、启动、重启和关闭 UFW 1、启动 2、关闭UFW 3、 重启 UFW 四、查看 UFW 状态 五、UFW 基本命令 1. 允许端口 &#xff08;1&#xff09;单个 TCP 端口 &#xff08;2&#xff09;允许单个 UDP 端口 &#xff08;3&#xff0…

MySQL增删改进阶

目录 1.数据库约束 1.1约束类型 1.2 not null约束 1.3 unique&#xff1a;唯一约束 1.4 default&#xff1a;默认约束 1.5 primary key&#xff1a;主键约束 1.6 foreign key:外键约束 1.7 check约束&#xff08;了解&#xff09; 2.表的设计 3.新增&#xff08;进阶&…

CUDA 运行时GPU信息查询

cuda 官网文档名&#xff1a;CUDA_Runtime_API 运行时API查询GPU信息 调用 cudaDeviceProp prop; cudaGetDeviceProperties(&prop, device_id) 定义 由此可见&#xff0c;只能在主机上调用。 #include <cuda_runtime.h>#include <iostream> #include <…

Apache Kafka消息传递策略

kafka消息传递策略 微信公众号&#xff1a;阿俊的学习记录空间小红书&#xff1a;ArnoZhangwordpress&#xff1a;arnozhang1994博客园&#xff1a;arnozhangCSDN&#xff1a;ArnoZhang1994 现在我们了解了一些关于生产者和消费者的工作原理&#xff0c;接下来讨论Kafka在生产…

Java:玩家打怪小游戏

今天&#xff0c;我们尝试用Java来做一个“打怪小游戏”&#xff0c;听名字就知道&#xff0c;我们是应该创建几个成员和怪物&#xff0c;还有知道知道成员和怪物的血量&#xff0c;一次攻击的伤害等等。。当然我们的游戏攻击模式是“回合制”&#xff08;其实是别的方法&#…

SpringCloud-OpenFeign-服务接口调用

是什么 把需要暴露的api使用接口来暴露&#xff0c;客户端需要调用的时候&#xff0c;直接查看这个接口中有没有就可以了 通用步骤 架构说明 common模块 common 引入 openfeign 新建服务接口类 FeignClient(value "cloud-payment-service") // 服务名 public i…

【数据采集工具】Flume从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十三)--权限设置注意事项和属主属组设置sudo操作

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十三&#xff09;–权限设置注意事项和属主属组设置sudo操作 一、linux 权限设置 特殊注意事项 1、使用root用户创建一个文件夹&#xff08;/oo&#xff09;&#xff0c;权限默认&…