c++11特性 std::function 简单实验

1.概要

std::function 是 C++11 引入的一个通用、多态的函数封装器。它可以存储、复制和调用任何 Callable 目标 —— 函数、Lambda 表达式、bind 表达式或其他函数对象。这使得 std::function 成为一个非常强大的工具,可以用来表示和操作一般的可调用对象。

2.代码

下面是一个简单的 std::function 实验,展示了如何使用它来存储不同类型的可调用对象,并调用它们:

#include <iostream>  
#include <functional> // 包含 std::function 的头文件  // 一个简单的函数  
int add(int a, int b) {  return a + b;  
}  // 一个函数对象(也称为仿函数)  
struct Multiply {  int operator()(int a, int b) const {  return a * b;  }  
};  int main() {  // 使用 std::function 存储一个普通函数  std::function<int(int, int)> func1 = add;  int result1 = func1(3, 4); // 调用 func1,相当于调用 add(3, 4)  std::cout << "Result 1: " << result1 << std::endl; // 输出: Result 1: 7  // 使用 std::function 存储一个 Lambda 表达式  std::function<int(int, int)> func2 = [](int a, int b) { return a - b; };  int result2 = func2(7, 3); // 调用 func2,执行 Lambda 表达式  std::cout << "Result 2: " << result2 << std::endl; // 输出: Result 2: 4  // 使用 std::function 存储一个函数对象  std::function<int(int, int)> func3 = Multiply();  int result3 = func3(5, 6); // 调用 func3,相当于调用 Multiply()(5, 6)  std::cout << "Result 3: " << result3 << std::endl; // 输出: Result 3: 30  // std::function 也可以接受没有参数的 Callable 对象  std::function<void()> func4 = []() { std::cout << "Hello, std::function!" << std::endl; };  func4(); // 调用 func4,输出 "Hello, std::function!"  return 0;  
}

3.运行结果

Result 1: 7
Result 2: 4
Result 3: 30
Hello, std::function!

4.代码说明

在这个例子中,我们定义了三个不同类型的可调用对象:一个普通的函数 add,一个函数对象 Multiply,以及一个 Lambda 表达式。我们创建了三个 std::function 对象 func1、func2 和 func3,分别用于存储这些可调用对象。然后,我们通过调用这些 std::function 对象来执行相应的操作,并打印结果。

5.补充说明

最后,我们还展示了如何使用 std::function 存储一个不接受任何参数的可调用对象(在这种情况下是一个 Lambda 表达式),并通过调用它来执行操作。

std::function 的强大之处在于它的多态性:你可以使用相同的 std::function 对象来存储不同类型的可调用对象,并在需要时调用它们。这使得代码更加灵活和可重用。

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

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

相关文章

信号量和互斥锁的区别

信号量和互斥锁都是用于多线程编程中的同步机制&#xff0c;但它们在用途和操作上存在一些差异。具体分析如下&#xff1a; 用途&#xff1a;互斥锁&#xff08;Mutex&#xff09;主要用于实现线程间的互斥&#xff0c;即确保同一时刻只有一个线程能够访问共享资源或临界区。它…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

mac 教程 终端如何拆墙

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)

【Paddle】PCA线性代数基础及领域应用 写在最前面一、PCA线性代数基础1. PCA的算法原理2. PCA的线性代数基础2.1 标准差 Standard Deviation2.2 方差 Variance2.3 协方差 Covariance2.4 协方差矩阵 The Covariance Matrix2.5 paddle代码demo①&#xff1a;计算协方差矩阵2.6 特…

4.8 Python dict字典

Python dict字典详解 Python字典&#xff08;dict&#xff09;是一种无序的、可变的序列&#xff0c;它的元素以“键值对&#xff08;key-value&#xff09;”的形式存储。相对地&#xff0c;列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;都是有序的序…

Java基础教程(8)-Java中的面向对象和类(二)

面向对象的三大基本特征 封装(Encapsulation)继承(Inheritance)多态(Polymorphism)封装 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 封装是面向对象的特征之一,是对象和类概念的主要特性。…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时&#xff0c;可以通过bugreport把系统当前时刻点&#xff08;运行BugRepot的时刻&#xff09;的系统相关的状态和信息…

HarmonyOS 实战开发-MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎&#xff0c;它提供了面向不同硬件设备 AI 模型推理的功能&#xff0c;目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…

YOLOv5利用Labelimg标注自己数据集

目录 一、Labelimg介绍二、Labelimg下载三、Labelimg安装四、Labelimg使用1、准备2、开始标注 一、Labelimg介绍 LabelImg是一款开源的图片标注工具&#xff0c;使用Python编写&#xff0c;基于PyQt5框架。它提供了一个直观的图形用户界面&#xff0c;方便用户对图片进行标注&…

axios——503响应超时重复多次请求——技能提升

今天在写后台管理系统时&#xff0c;遇到一个问题&#xff0c;就是每天早上一启动项目&#xff0c;接口会提示503超时&#xff0c;因此项目运行必须重新刷新请求成功后才可以正常使用。 后端同事说请求超时了&#xff0c;需要前端处理一下&#xff0c;如果是503的状态码&#…

Golang特殊init函数

介绍 init()函数是一个特殊的函数&#xff0c;存在一下特性 不能被其它函数调用&#xff0c;而是子main()函数之前自动调用不能作为参数传入不能有传入参数和返回值 作用&#xff1a; 对变量进行初始化检查/修复程序状态注册运行一次计算 以下是<<the way to go>>…

opengles在车载360环视avm系统中的应用简介

360环视是辅助驾驶系统的一个技术点&#xff0c;通过鱼眼相机模型标定&#xff0c;图像拼接&#xff0c;鸟瞰图生成&#xff0c;3d渲染等手段把车体周围图像经过3D渲染后&#xff0c;生成2D鸟瞰图和3D环视图&#xff0c;在中控屏幕上显示&#xff0c;用于辅助倒车等。其具体的技…

Web APIs 学习归纳1---Web API概述简单的元素获取

JS基础中我们学习了JS的基本语句&#xff0c;这些是后续学习中的基础。 有了上述JS的基础以后&#xff0c;我们就可以开始学习交互效果的实现方法。这里很多时候直接调用JS封装好的API即可。 一、Web APIs 和 JS 基础关联性 这里有一张图很好的解释了这个问题&#xff1a; 我们…

python高校贫困学生资助奖学金管理系统vue+django

我们根据项目文档&#xff0c;包括规格说明、文档及在设计过程中形成的测试大纲、测试内容及测试的通过准则、再次全面熟悉系统&#xff0c;做好测试准备。为了保证测试的质量&#xff0c;我们将测试过程分为几个阶段。第一阶段&#xff0c;在单元测试阶段我们对每个子模块进行…

可视化+多人协同技术原理和案例分享

前言 hi&#xff0c;大家好&#xff0c;我是徐小夕&#xff0c;之前和大家分享了很多可视化低代码的技术实践&#xff0c;最近也做了一款非常有意思的文档搭建引擎——Nocode/Doc&#xff1a; 也做了一些分享&#xff1a; Nocode/Doc&#xff0c;可视化 零代码打造下一代文件编…

SpringBoot+vue开发记录(二)

说明&#xff1a;本篇文章的主要内容为SpringBoot开发中后端的创建 项目创建: 1. 新建项目&#xff1a; 如下&#xff0c;这样简单创建就行了&#xff0c;JDK什么的就先17&#xff0c;当然1.8也是可以的&#xff0c;后面可以改。 这样就创建好了&#xff1a; 2. pom.xml…

js修改路由参数+vue——js基础

最近在写看板&#xff0c;要求执行某个操作后更改路由参数&#xff0c;方便用户保存地址以便于下次直接获取对应的数据。 比如&#xff1a;原地址&#xff1a;http://localhost:4200/tvType/out 执行某个操作后&#xff0c;地址变更为&#xff1a;http://localhost:4200/tvTyp…

IP地址 0.0.0.0 和 127.0.0.1之间的区别

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

应用回归分析,R语音,逐步回归法,第5章

library(readr) data3_1 <- read_csv("data3.1.csv")View(data3_1) lm5<-lm(y~.,data=data3_1) lm6<-step(lm5,direction = "both") summary(lm6) 输出: Start: AIC=377.73 y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9Df Sum of Sq …

ChatGPT全方位指导:学术论文写作从零开始,轻松搞定高质量论文!

目录 文末福利 一、论文选题的深度探讨 二、撰写摘要的艺术 三、关键词的精选 四、引言的构建 五、正文的结构设计 六、撰写结论的策略 七、致谢的编写 八、附录的有效利用 九、参考文献的整理 文末有福利哦 撰写一篇高质量的学术论文是一项既复杂又耗时的任务。这个…