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

C++之std::function的介绍

C++之std::function的介绍

    • std::function和函数指针的区别介绍
    • std::function 的常见用法包括
    • 用法举例

std::function和函数指针的区别介绍

std::function 和函数指针在 C++ 中都可以用来存储和调用函数,但它们的使用方式和功能有所不同。

函数指针是一种指向函数的指针,它可以用来调用函数。函数指针的类型取决于它指向的函数的类型,比如函数的参数类型和返回类型。函数指针在编译时就需要确定它所指向的函数类型,并且一旦定义后不能更改。

std::function 是一个可调用对象的封装器,它可以存储和调用函数、函数指针、函数对象、lambda 表达式等。std::function的类型并不取决于它存储的具体可调用对象的类型,而是取决于调用操作符()的参数类型和返回类型。这意味着你可以用std::function 来存储和调用不同类型的可调用对象,只要它们的参数类型和返回类型相同。此外,std::function` 还提供了一些其他的功能,比如可以检查它是否存储了一个可调用对象,或者获取存储的可调用对象的参数类型和返回类型等信息。

总的来说,std::function 比函数指针更加灵活和强大,它可以用来实现更加复杂的可调用对象的存储和调用。

std::function 的常见用法包括

1)作为回调函数:std::function 可以用来作为回调函数,特别适合在需要回调函数作为参数的函数中使用。例如,你可以将 std::function 对象作为参数传递给一个函数,然后在该函数中使用回调函数的方式进行处理。这种方式的优点是你可以将任何类型的函数或函数对象传递给该函数,增加了代码的灵活性和可维护性。
2)保存和延迟函数的执行:std::function 可以用来保存函数或函数对象,并延迟其执行。这在某些情况下非常有用,比如你需要在某个特定的时间点或事件发生后再执行该函数。你可以将 std::function 对象存储在一个数据结构中,然后在适当的时候使用 () 运算符来调用它。
3)函数指针和成员函数的替代:std::function 可以替代函数指针的作用,而且比函数指针更加灵活和便利。它可以用于回调函数、信号和槽等机制中,而无需关心传递的参数或返回值类型。同时,它也可以用来代替成员函数指针,使得算法和数据结构更加通用和易于使用。
4)多态性:std::function 具有多态性,它可以绑定到基类的函数,也可以绑定到派生类的函数。这种特性使得它可以用于实现类似于函数指针的通用回调机制,同时也可以用于实现面向对象编程中的多态行为。

用法举例

例子一:

#include <iostream>  
#include <functional>  // 函数类型  
void func() {  std::cout << "Function called" << std::endl;  
}  int main() {  // 创建一个 std::function 对象,并初始化为上面的函数  std::function<void()> f = func;  // 使用 () 运算符调用函数  f();  // 输出:Function called  return 0;  
}

在上面的例子中,我们首先定义了一个名为 func 的函数,然后创建了一个 std::function 对象 f,并将其初始化为 func 函数。最后,我们使用 () 运算符调用 f。

例子二:

#include <iostream>  
#include <functional>  // 函数类型,接受两个 int 参数,返回 int  
int add(int a, int b) {  return a + b;  
}  int main() {  // 创建一个 std::function 对象,并初始化为上面的函数  std::function<int(int, int)> f = add;  // 使用 () 运算符调用函数  int result = f(1, 2);  // 输出:3  std::cout << "Result: " << result << std::endl;  return 0;  
}

在这个例子中,我们定义了一个名为 add 的函数,它接受两个 int 参数并返回一个 int。然后,我们创建了一个 std::function 对象 f,并将其初始化为 add 函数。最后,我们使用 () 运算符调用 f 并输出结果。

http://www.lryc.cn/news/178832.html

相关文章:

  • 卷积神经网络学习(一)
  • 使用KEIL自带的仿真器仿真遇到问题解决
  • 4700 万美元损失,Xn00d 合约漏洞攻击事件分析
  • 第5讲:v-if与v-show的使用方法及区别
  • C理解(一):内存与位操作
  • ESP8266使用记录(四)
  • 云原生Kubernetes:K8S安全机制
  • 【数据结构】归并排序、基数排序算法的学习知识点总结
  • 【C++】C++模板进阶 —— 非类型模板参数、模板的特化以及模板的分离编译
  • HTML的相关知识
  • 基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)
  • Java后端接口编写流程
  • 【问题记录】解决“命令行终端”和“Git Bash”操作本地Git仓库时出现 中文乱码 的问题!
  • 软考高级之系统架构师之软件需求工程
  • 使用 Velocity 模板引擎的 Spring Boot 应用
  • mysql的mvcc详解
  • FreeRTOS两个死机原因(中断调用接口异常)【杂记】
  • 【AI视野·今日Robot 机器人论文速览 第四十三期】Thu, 28 Sep 2023
  • 批量快捷创建新数组的几种方式
  • 单目标应用:基于沙丁鱼优化算法(Sardine optimization algorithm,SOA)的微电网优化调度MATLAB
  • 基于Halo搭建个人博客
  • DPDK系列之三十一DPDK的并行机制简介
  • 【Java】复制数组的四种方式
  • 设计模式5、原型模式 Prototype
  • 驱动挂载物理页代码示例
  • 【新版】系统架构设计师 - 层次式架构设计理论与实践
  • 大数据Flink(九十):Lookup Join(维表 Join)
  • Docker方式创建MySQL8的MGR集群
  • 问 ChatGPT 关于GPT的事情:扩展篇
  • Spring Boot 集成 MinIO 实现文件上传、下载和删除