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

news/2024/10/19 5:26:22/

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.ppmy.cn/news/1438449.html

相关文章

【Python-Pygame】

Python-Pygame ■ Pygame-简介■ Pygame-安装■ Pygame-Rect区域位置■ Pygame-Draw绘图函数■ Pygame-■ Pygame-■ Pygame-■ Pygame-事件监听■ Pygame-Event事件模块■ Pygame-游戏循环■ Pygame-Display显示模块■ Pygame-Time时间控制■ Pygame-Font文本和字体■ Pygame-…

每天一个数据分析题(二百八十二)

积分表result中有A B C D四列&#xff0c;要求&#xff1a;1&#xff09;当A列值大于等于B列时&#xff0c;选择A列否则选择B列 2&#xff09;当C列值大于等于D列时&#xff0c;选择C列否则选择D列 用SQL语句实现正确的是&#xff1a;&#xff08; &#xff09; A. select ( w…

W11安装WSL2 ubuntu 攻略

W11安装WSL2 ubuntu 攻略 最近换了新电脑重新安装一遍wsl2&#xff0c;记录一下方便以后使用。 打开控制面板&#xff0c;选择程序 —— 启用或关闭Windows功能&#xff0c;勾选 适用于Linux的Windows子系统还有虚拟机平台选项&#xff0c;修改后需要重启 wsl2版本 wsl --se…

Visual Studio2022创建水晶报表项目

1.先下载Visual Studio 2022 &#xff0c;我选的是Community2022版本。 官网&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 2.下载完成并安装后&#xff08;安装直接执行exe文件就ok&#xff09;&#xff0c;会出现一个界面。点击…

使用streamlit构建网站

1.目的 最近团队有一个人脸识别的项目&#xff0c;想做一个网站界面来演示&#xff0c;同时使用了花生壳进行内网穿透&#xff0c;使得可以在其他设备访问该界面。 2.算法部分 import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2 import matplotlib as mpl mpl.use(TkAgg) impo…

rust 卸载重新安装 安装

原因&#xff1a;接触区块链时报错 linking with x86_64-w64-mingw32-gcc failed: exit code: 1 Rust编译需要C环境&#xff0c;如果你没有&#xff0c;Rust也能安装成功&#xff0c;只是无法编译代码 C的编译工具有两个&#xff0c;一个是msvc&#xff0c;也就是visual studi…

2.C++类和对象

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

Java23种设计模式-行为型模式之策略模式

策略模式&#xff08;Strategy Pattern&#xff09;&#xff1a;将算法的使用从算法的实现中分离出来&#xff0c;从而让算法的变化不会影响到使用算法的用户。 通常涉及三个角色&#xff1a; 1.上下文&#xff08;Context&#xff09;&#xff1a;持有策略接口的引用&#xf…