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

C++11相较于C++98多了哪些可调用对象?--《包装器》篇

C++98里面的可调用对象只有普通函数和函数指针。
而在C++11里面可调用的对象有下面几种:

  • 普通函数
  • 函数指针
  • 仿函数
  • lambda表达式(匿名函数)
  • 包装器
    普通函数、函数指针、仿函数、lambda表达式我在以前的文章里其实已经介绍过了

包装器

在C++11里面有多种类型的可调用对象,包装器可以将这些对象包装起来,给我们提供一个统一的视角。相当于给外面再套了一层盒子。

包装器的定义

//1
template <class T> function;     // undefined
//2
template <class Ret, class... Args> 
class function<Ret(Args...)>;

它的定义貌似很奇怪,包装器提供了模板,2是1的特化,Ret指出可调用对象的返回值类型,并且给我们提供了可变参数,用一个省略号...指出模板参数或函数参数是一个包。
function包含在头文件<functional>里面,而且在std域里
包装方式:function<返回类型(参数类型1,参数类型2,...., 参数类型n)> name = 可调用对象
使用方式:name(参数1, 参数2, ...,参数n)


使用方式类似于函数
例一:包装普通函数

#include <iostream>
#include <functional>
using namespace std;int f(int x, int y)
{return x - y;
}
int main(void)
{//用包装器包装起来function<int(int, int)> f1 = f;cout << f1(2, 1) << endl;return 0;
}

例二:包装lambda表达式

	//包装可调用对象lambda表达式function<int(char, char, char)> f2 = [](char e1, char e2, char e3)mutable->int{return e1 - e2 + e3;};cout << f2('z', 'a', 'x') << endl;

例三:包装仿函数

class Student
{
public://重载(),仿函数char operator()(string str){return str[0];}
};//包装可调用对象,仿函数function<char(string)> f3 = Student();cout << f3("hello") << endl;

在某些情况下我们可能需要提供一个统一的接口来接收这些类型,就需要使用到包装器。
包装器一般会和std::bind结合使用

std::bind

std::bind在包装器中有如下作用
作用1:调整参数顺序
作用2:调整参数个数

simple(1)	
template <class Fn, class... Args>
bind (Fn&& fn, Args&&... args);with return type (2)	
template <class Ret, class Fn, class... Args>
bind (Fn&& fn, Args&&... args);

bind在包装器里面的作用简单来说就是利用旧的可调用对象创建了一个新的。第一个参数是一个万能引用,用来接收可调用对象,而它使用后面的参数包指明新对象的函数参数。

int f(int x, int y)
{return x - y;
}//用包装器包装起来function<int(int, int)> f1 = f; //普通函数cout << f1(2, 1) << endl;//使用bindfunction<int(int, int)> ff1 = bind(f, placeholders::_1, placeholders::_2);cout << ff1(2, 1);

在使用std::bind的时候,使用placeholders::_n指明旧的可调用对象的参数,n对应参数在原来的参数列表里是第几个。这里的placeholders::_1指的就是x。

那么我们可以利用bind来调整参数的顺序

function<int(int, int)> ff1 = bind(f, placeholders::_2, placeholders::_1);

一些特定情况下,某个参数的值是固定的。调整参数的个数,实际上调整的是bind新创建对象的参数。

	function<int(int)> f4 = bind(f, 95, placeholders::_1);cout << f4(12) << endl;

对于对象f来说,它调用的时候需要两个int类型的参数。当我们进行如上操作的时候,将第一个参数固定成了95,调用的时候,就只需要传递一个参数就可以。
使用bind调整参数个数时需要注意

  • 如果想要固定某一个参数,在bind的时候需要指明
  • 指明以后,placeholders::_X,这个X从旧可调用对象的下一个参数开始算起。
  • function也需要做相应的改变,实例化的时候,用bind固定的参数类型不需要再写进来。

相关文章:

C++11相较于C++98多了哪些可调用对象?--《包装器》篇

C98里面的可调用对象只有普通函数和函数指针。 而在C11里面可调用的对象有下面几种&#xff1a; 普通函数函数指针仿函数lambda表达式&#xff08;匿名函数&#xff09;包装器 普通函数、函数指针、仿函数、lambda表达式我在以前的文章里其实已经介绍过了 包装器 在C11里面有…...

栈与队列:常见的线性数据结构

栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是计算机科学中常见的线性数据结构&#xff0c;它们在许多算法和编程场景中发挥着重要作用。它们的不同特点和用途使得它们适用于不同的问题和应用。 栈&#xff08;Stack&#xff09; 栈&#xff0c;作为…...

android framework之AMS的启动管理与职责

AMS是什么&#xff1f; AMS管理着activity&#xff0c;Service, Provide, BroadcastReceiver android10后&#xff1a;出现ATMS,ActivityTaskManagerService:ATMS是从AMS中抽出来&#xff0c;单独管理着原来AMS中的Activity组件 。 现在我们对AMS的分析&#xff0c;也就包含对…...

Decoupling Knowledge from Memorization: Retrieval-augmented Prompt Learning

本文是LLM系列的文章&#xff0c;针对《Decoupling Knowledge from Memorization: Retrieval 知识与记忆的解耦&#xff1a;检索增强的提示学习 摘要1 引言2 提示学习的前言3 RETROPROMPT&#xff1a;检索增强的提示学习4 实验5 相关实验6 结论与未来工作 摘要 提示学习方法在…...

腾讯云coding平台平台inda目录遍历漏洞复现

前言 其实就是一个python的库可以遍历到&#xff0c;并不能遍历到别的路径下&#xff0c;后续可利用性不大&#xff0c;并且目前这个平台私有部署量不多&#xff0c;大多都是用腾讯云在线部署的。 CODING DevOps 是面向软件研发团队的一站式研发协作管理平台&#xff0c;提供…...

无法正常访问服务器

网络原因&#xff0c;本地网络&#xff1a;解决办法&#xff1a;检查本地网络是否正常&#xff0c;访问外网是否流畅。机房网络&#xff1a;通过路由追踪查看是否中间有 节点不通&#xff0c;确定是线路出现丢包。 远程连接&#xff0c;检查远程连接是否启用以及远程计算机上的…...

解决css英文内容不自动换行的问题

解决css英文内容不自动换行的问题 这里主要是针对CMS后台管理系统添加进入数据库&#xff0c;再抓取出来前端显示的英文不换行的问题的情况 1.一般常见的就是英文不自动换行&#xff0c;或者英文换行单词背截断的问题。 这种处理方法通过前端样式就可以解决&#xff0c;方法网…...

python语言学习

序言 此系列用于总结python语言的相关知识点&#xff0c;用于帮助自己和有缘人查阅 1、python基本数据类型 python基本数据类型 – 字符串...

1. 深度学习介绍

1.1 AI地图 ① 如下图所示&#xff0c;X轴是不同的模式&#xff0c;最早的是符号学&#xff0c;然后概率模型、机器学习。Y轴是我们想做什么东西&#xff0c;感知是我了解这是什么东西&#xff0c;推理形成自己的知识&#xff0c;然后做规划。 ② 感知类似我能看到前面有个屏…...

【现场问题】oracle 11g 和12c 使用jdbc链接,兼容的问题

oracle不同版本 问题是什么寻找解决方式首先Oracle的jdbc链接有几种形式?Oracle 11g的链接是什么呢Oracle 12C的链接是什么呢我的代码是哪种&#xff01;&#xff1f;发现问题没 解决问题代码 问题是什么 项目上建立Oracle数据源&#xff0c;以前大部分都是&#xff0c;11g的…...

嵌入式底层驱动需要知道的基本知识

先说结论&#xff0c;能&#xff0c;肯定能&#xff0c;必须能&#xff01; 但是&#xff0c;问题重点在于坚持&#xff0c;程序员这一行 &#xff0c;下班回家一般都要10点了&#xff0c;再刷两个小时枯燥的学习视频&#xff0c;我想大多数人是坚持不下来的。 但是&#xff…...

《软件开发的201个原则》阅读笔记 120-161条

目录 使用有效的测试完成度标准 原则122 达成有效的测试覆盖 原则123 不要在单元测试之前集成 原则 124 测量你的软件 原则125 分析错误的原因 对错不对人 原则127 好的管理比好的技术更重要 使用恰当的方法 原则 129 不要相信你读到的一切 原则130 理解客户的优先级 原…...

JVM——类加载与字节码技术—类文件结构

由源文件被编译成字节码文件&#xff0c;然后经过类加载器进行类加载&#xff0c;了解类加载的各个阶段&#xff0c;了解有哪些类加载器&#xff0c;加载到虚拟机中执行字节码指令&#xff0c;执行时使用解释器进行解释执行&#xff0c;解释时对热点代码进行运行期的编译处理。…...

C语言学习之main函数两个参数的应用

main函数的两个参数&#xff1a; int main(int argc, char const *argv[]) {/* code */return 0; }参数argc:表示在执行程序时&#xff0c;在终端所输入参数的个数&#xff0c;包括可执行文件的名称&#xff1b;参数argv:1.本质上是一个字符型指针数组&#xff1b;2.用于获取指…...

本地部署 Stable Diffusion(Windows 系统)

相对于使用整合包&#xff0c;手动在 Windows 系统下本地部署 Stable Diffusion Web UI&#xff08;简称 SD-WebUI&#xff09;&#xff0c;更能让人了解一些事情的来龙去脉。 一、安装前置软件&#xff1a;Python 和 Git 1、安装 Python for windows。 下载地址 https://www.p…...

Java源码分析(二)Double

本篇是源码分析的第二篇&#xff0c;上篇我们一起分析了Integer类的源码&#xff0c;本篇一起学习下Double类的源码&#xff0c;看下其实现。 一、Double类图 首先&#xff0c;相比Integer&#xff0c;Double类的源码只有1000行代码。如下是Integer及其关联类/接口的类图&#…...

文件上传漏洞之条件竞争

这里拿upload-labs的第18关做演示 首先先看代码 $is_upload false; $msg null;if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_name $_FILES[upload_file][name];$temp_file $_FILES[upload_file][tmp_name];$file_ext substr($file_name,strrpos($file_…...

javacv基础04-图像色彩空间转换函数Imgproc.cvtColor()(彩图转灰度图示例)

opencv python 实现方式参考 opencv-19 图像色彩空间转换函数cv2.cvtColor() javacv 中的函数 Imgproc.cvtColor(image, grey, Imgproc.COLOR_BGR2GRAY); 参数说明&#xff1a; image: 原始图像新灰度图转换参数&#xff1a;多种转换方式参考上面链接地址内容 javacv 实现方式…...

Spring Boot进阶(60):5种判断线程池任务是否全部完成的方案 | 实用技巧分享!

1. 前言&#x1f525; 多线程编程在现代软件开发中非常常见且重要&#xff0c;而线程池是多线程编程的常用技术。在使用线程池时&#xff0c;通常需要判断线程池中的任务是否全部完成&#xff0c;以便决定程序继续执行的下一步操作。本文将介绍5种判断线程池任务是否全部完成的…...

Git相关介绍和操作

Git 是一个版本控制系统&#xff0c;它可以记录代码的变更历史&#xff0c;并允许多人协同开发。下面是 Git 的基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git 仓库用于存储代码的版本历史&#xff0c;包括代码变更、注释、作者、时间…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...