【C++11】包装器 和 bind函数 的定义与 使用

news2024/11/20 13:32:04

包装器

在C++11标准中,没有提供内置的包装器功能,但我们可以使用一些技术手段来实现包装器的效果。下面介绍两种常用的方法:

函数对象包装器

  1. 函数对象包装器(Function Object Wrapper): C++11引入了 std::function 模板类,它可以用于封装各种函数对象(如函数指针、lambda函数、可调用对象等),使其具备统一的调用接口。通过 std::function ,你可以创建能够存储和调用各种函数类型的对象。

首先看下面代码

template<class F, class T>
T useF(F f, T x)
{
	// 打印出 count 的值和地址
	static int count = 0;
	cout << "count: " << ++count << endl;
	cout << "&count -> " << &count << endl;
	return f(x);
}

double f(double i)
{
	return i / 3;
}

struct Functor
{
	double operator()(double d)
	{
		return d / 2;
	}
};

int main()
{
	// 函数名 做参数
	cout << useF(f, 11.4) << endl;
	// 函数对象 做参数
	cout << useF(Functor(), 11.4) << endl;
	// lambda 表达式 做参数
	cout << useF([](double d)->double { return d / 4; }, 11.4) << endl;

	// 上述执行过程中,useF 模板实例化了三份
	return 0;
}

对于上述代码有 执行结果:

在这里插入图片描述

可以看出,三次&count 的结果是不同的,即useF模板实例化了三次,原因分析:

  • 对于上述代码,useF 模板函数在每次调用时都需要进行实例化,因为传递给 useF 函数的函数对象或函数指针具有不同的函数签名
  • f 函数的函数签名是 double(double)Functor 函数对象的函数签名是 double operator()(double),而 lambda 表达式的函数签名是 (double)->double

而使用包装器可以较好的解决这个问题


函数类型包装器

定义

#include <functional>

template <class Ret, class... Args>
class function<Ret(Args...)> {
    // 实现代码
};
  • Ret: 被调用函数的返回类型
  • Args…:被调用函数的形参

使用方法

不改变上述代码,将main函数的执行代码使用 function 包装器的形势:
在这里插入图片描述
以下为执行结果:

在这里插入图片描述

可以看出 &count 的结果相同,即 useF 只进行了一次模板实例化

  • 对于给定的代码,useF 模板函数只需要实例化一次是因为在调用 useF 函数时,模板参数的类型已经确定。每个模板实例化都是在编译时完成的,而不是在运行时。
  • 在主函数中,我们分别使用了 func1、func2 和 func3 来实例化 useF 模板函数。这三个 std::function 对象具有相同的函数签名 double(double),因此 useF 模板函数只需要实例化一次来处理这个特定的函数签名。

bind

定义

在这里插入图片描述

  1. std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。
  2. 一般情况下,它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺
    序调整等操作

基本语法

#include <functional>

auto bound_function = std::bind(function, args...);
  1. bound_function 本身是一个可调用对象,args... 是一个逗号分隔的参数列表,对应给定的
    function的参数。

  2. 当我们调用 bound_function 时,bound_function 会调用 function,并传给它args…中
    的参数。

在对bind 的描述中,有这么一句话:
在这里插入图片描述
即: 每个参数可以绑定到一个值,也可以是一个占位符

  • arg... 中的参数可能包含形如 _n 的名字,其中n是一个整数,这些参数是 “占位符” ,表示bound_function 的参数,它们占据了传递给bound_function的参数的“位置”。

  • 数值n表示生成的可调用对象中参数的位置_1 代表 bound_function 的第一个参数_2代表第二个参数 ,以此类推


使用

int Plus(int a, int b)
{
	// 两数相加
	return a + b;
}

class Sub
{
public:
	int sub(int a, int b)
	{
		// 两数相减
		return a - b;
	}
};

using placeholders::_1;
using placeholders::_2;

对上面代码,我们进行不同的测试:

测试1

在这里插入图片描述

测试2

在这里插入图片描述

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

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

相关文章

CCLINK IE 转MODBUS-RTU网关modbusrtu地址对照表

远创智控YC-CCLKIE-RTU。这款产品的主要功能是将各种MODBUS-RTU、RS485、RS232设备接入到CCLINK IE FIELD BASIC网络中。 那么&#xff0c;这款通讯网关又有哪些特点呢&#xff1f;首先&#xff0c;它能够连接到CCLINK IE FIELD BASIC总线中作为从站使用&#xff0c;同时也能连…

晶体三极管总结

目录 1.3.1晶体管的结构与类型 1.3.2晶体管的电流放大作用 1.3.3晶体管的共射特性曲线 晶体三极管中有两种带有不同的极性电荷的载流子参与导电&#xff0c;故称之为双极型晶体管&#xff08;BJT&#xff09;Bipolar Junction Transistor 1.3.1晶体管的结构与类型 晶体三极…

PowerShell设置最美界面

在 Windows 上安装 scoop&#xff1a; scoop是什么 windows下的安装源搜索工具&#xff0c;有点类似centos下的yum和Ubuntu下的apt。用这个拉下来安装的软件没有广告。 scoop官方网址&#xff1a; https://scoop.sh/A command-line installer for Windowshttps://scoop.sh/ …

scratch二级、三级常考大题

目录 1. 绘制多彩五角星 2. 躲避陨石 3. 数星星 4. 古堡历险记 5. 五彩糖葫芦 6. 疫情隔离和核酸检测模拟 7. 画正方形 8.大鱼吃小鱼 9. 接水果 10. 绘制正方形 1. 绘制多彩五角星 1.准备工作 &#xff08;1&#xff09;选择背景stars、角色Pencil&#xff1b; &am…

工作日志3 对类型的判断 slice的截取对于jq的使用 el-table的表头和内容的位置

在 JavaScript 中&#xff0c;你可以使用多种方式来判断某个值是否为空。以下是几种常见的方法&#xff1a; 使用严格相等运算符 () 检查值是否为 null 或 undefined&#xff1a; var value null; // 或者 undefinedif (value null || value undefined) {// 值为空 }使用逻…

Linux常用命令——elm命令

在线Linux命令查询工具 elm 纯文本邮件客户端程序 补充说明 elm命令是一个E-mail客户端管理程序&#xff0c;它提供了纯文本交互式全屏幕界面。 语法 elm(选项)选项 -s<邮件主题>&#xff1a;指定新邮件的邮件主题&#xff1b; -f<目录>&#xff1a;开启程序…

Flutter 使用JSONToDart 生成bean文件

1. 首先安装插件&#xff0c;进入flile-setting-plugins 2.然后搜索安装jsontodart&#xff0c;之后重启ide使其生效 3.在你需要使用的地方直接鼠标右键 或者使用快捷键AltShiftD 4.然后会出现这样一个弹窗&#xff0c;输入你要用到的json数据&#xff0c;和文件名称点击生成就…

2023年房地产经纪中介行业研究报告

第一章 行业概况 1.1 概述 房地产经纪中介行业是一个专业的服务行业&#xff0c;主要涉及在买家和卖家之间进行房地产交易的媒介服务。这些服务包括评估和定价房产&#xff0c;对房产进行营销和推广&#xff0c;协助谈判和结算交易等。在这个行业中&#xff0c;中介公司通常会…

C国演义 [第九章]

第九章 买卖股票的最佳时机III题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机IV题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机III 力扣链接 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格 设计一个算法…

每日科技分享-POE新增文件和链接发送功能

POE推出新功能 注意POE需要魔法上午才能进去。 实测 实测可以发送论文给chatgpt&#xff0c;然后和AI进行共享的对话。 POE网站链接&#xff1a; 也可以发送链接&#xff0c;实测了一下&#xff0c;似乎有时候并不准确&#xff0c;我发送了关于分层强化的文章&#xff0c;但是…

按首字母排序分组(类通讯录)

移动端开发过程中&#xff0c;有遇到按首字母分组排序的&#xff0c;仿通讯录效果 那实现过程中&#xff0c;我们需要安装插件 npm i --save js-pinyin 安装后使用&#xff1a; 在页面中引用 import Pinyin from js-pinyin 调用 const sortByFirstLetter (origin) &g…

笔记本电脑的电池健康:确保长时间使用和优异性能的关键

笔记本电脑已经成为我们日常生活中不可或缺的工具&#xff0c;无论是办公、学习还是娱乐&#xff0c;我们都依赖着它的便携性和高效性能。而在所有的硬件组件中&#xff0c;电池健康被认为是确保长时间使用和良好性能的关键因素之一。一块健康的电池不仅能提供持久的续航时间&a…

从零开始的抢购脚本开发-油猴开发教程(多快好省)

文章目录 前言为何学习 JavaScript&#xff1f; JS简介JavaScript 能够改变 HTML 内容 JavaScript 能够改变 HTML 属性JavaScript 能够改变 HTML 样式 (CSS)JavaScript 能够隐藏 HTML 元素JavaScript 能够显示 HTML 元素JS的使用外部脚本外部 JavaScript 的优势外部引用JavaScr…

【JavaEE】了解JVM

JVM的基本认识 文章目录 【JavaEE】了解JVM1. JVM中的内存区域划分1.1 JVM的核心区域1.2 JVM内存城防图 2. JVM的类加载机制2.1 loading2.2 verification2.3 preparation2.4 resolution2.5 initialization2.6 类加载触发的时机2.7 双亲委派模型 3. JVM中的垃圾回收策略3.1 JVM释…

cmake 提前结束处理命令: return

有时候,我们有这样的需求,当处理到某个地方的时候,后面的我们都不想处理或者不需要处理的时候,就可以提前结束当前的处理逻辑,回到父级去处理.在C/C中,我们有break关键字跳出当前循环,continue关键字进入下一次循环,return关键字返回当前处理的函数. cmake也提供了break(),con…

浅谈电脑城的衰退是好是坏社会现象_kaic

在过去很长一段时间里&#xff0c;想要购买电子设备都逃不开一个叫“电脑城”的地方&#xff0c;那里鱼龙混杂良莠不齐&#xff0c;是令许多人记忆深刻分外难忘之处。 但是随着时代发展电商兴起&#xff0c;采用传统线下销售的电脑城却逐渐衰退甚至面临消失&#xff0c;对此你怎…

7-3 打怪升级

B0->途经堡垒1->...->B 总耗费能量 武器总价值输入样例: 6 12 1 2 10 5 2 3 16 20 3 1 4 2 2 4 20 22 4 5 2 2 5 3 12 6 4 6 8 5 6 5 10 5 6 1 20 25 1 5 8 5 2 5 2 1 2 6 8 5 4 2 3 6 5输出样例: 5 5->2 2 1 5->1->3 12 7 5->4->6 10 7 5 0 0#inclu…

目标检测——R-CNN网络基础

目录 Overfeat模型RCNN模型算法流程候选区域生成CNN网络提取特征目标分类&#xff08;SVM&#xff09;目标定位预测过程 算法总结 Fast RCNN模型算法流程ROI Pooling目标分类和回归 模型训练模型总结 Overfeat模型 RCNN模型 算法流程 候选区域生成 CNN网络提取特征 目标分类&am…

osg osgText::Text 中文乱码问题修复 解决中

osg osgText::Text 中文乱码问题修复 解决中 #include <osgDB/ConvertUTF>osg::Camera* osgWidget::createTextHUD() { osgText::Font* fontHei osgText::readFontFile("Fonts/simkai.ttf");text->setFont(fontHei);// 步骤二&#xff1a;设置 文字颜…

浅谈分布式系统 - 架构演进

目录 1. 架构演进 1.1 单机架构 1.2 什么是分布式架构 1.3 数据库和应用分离 1.4 引入负载均衡 1.5 引入数据库读写分离 1.6 引入缓存 1.7 数据库分库分表 1.8 微服务架构 2. 分布式系统下的常见概念 1. 架构演进 1.1 单机架构 单机架构只有一台服务器, 这个服务器…