Linux
Linux software install
Google repo的使用
Vector AP StartApplication编译脚本解析
Yocto的cmake版本升级
不能自动安装的解决方式
S32G-BSP35.0-SDK使用方法
S32G从SDK生成文件系统的制作过程
Linux Samba设置
Linux添加双网卡
S32G USB-Redirector安装指南
VS code自动生成Doxygen格式注释
Linux下使用多线程下载
使用pandoc 生成带中文的pdf
minicom无法输入的问题解决办法
使用 systemd unit 添加一条路由规则
CMake 教程
步骤 1:基本起点
步骤 2:添加lib库
步骤 3:为库添加使用要求
步骤 4:添加生成器表达式
步骤 5:安装和测试
步骤 6:添加支持测试仪表板
步骤 7: 添加系统内省
步骤 8:自定义命令和生成的文
步骤 9:打包安装程序
步骤 10:选择静态库或共享库
步骤 11:添加导出配置
步骤 12:打包 Debug 和 Release
添加虚拟网卡
Vector AP 去掉防篡改校验
Vector AP startapplication编译与使用
Vector AP问题汇总
Vector AP大型项目开发流程
Vector AP EM
Vector AP 最简单的开发示例
Linux kernel 版本降级
Vector AP StartApplicaiton
startappplication-machine-design
startapplicaiton-machine-integration
amsr-vector-fs-em-executionmanager-design
amsr-vector-fs-em-executionmanager
Vector AP 复杂模型的开发
第一章 Machine和MachineDesign
第二章 Execute Manager
第三章 Log
第四章 State Manager
第五章 State Manager 源码的理解
第六章 Someip daemon
第七章 IPC Service Discovery Daemon
crond的使用方法
解决蓝牙鼠标在 Ubuntu 中单位时间内断开的问题
VPS服务器自建教程
v2rayA的客户端使用配置
GDB调试指南入门篇:揭开程序运行世界的神秘面纱
GDB调试指南高级篇:成为调试专家,掌控程序的命运
Linux安装PyQt5并配置Qt Designer
ADB 命令大全
GoogleTest(一)
GoogleTest(二)简单的TEST宏
GoogleTest(三)简单类函数测试
C++ Template
1. 函数模板
2. 类模板
3. 非类型模板参数
软件版本号规范
EPOLL
C++手札
C++ 使用{}初始化有哪些好处?
现代 C++ decltype 深入解析
函数对象(functor)
Linux性能剖析:CPU、内存、网络与I/O压力测试
AP StateManager
C++ Lambda表达式
C++ 中的Lambda表达式
Lambda 表达式语法
Lambda 表达式的示例
手动发送UDP数据包
pyqt5生成的UI界面不能输入中文
自己搭建repo镜像
摄影
Sony仿富士PP值设置
诗词歌赋
本文档使用 MrDoc 发布
-
+
首页
函数对象(functor)
## 前言 ```cpp // 函数对象(functor) struct Multiply { int operator()(int a, int b) const { return a * b; } }; ``` 这不是结构体吗?怎么改名字叫函数对象了。对于我们这些老程序员,很难转变过来。 **** 理解你们的感受,特别是对于那些已经习惯了传统术语的老程序员来说,适应这些新概念确实需要一些时间。让我们一步步地解释为什么这种结构体现在被称为“函数对象”或“functor”。 ## 什么是函数对象(Functor)? 函数对象,也称为“functor”,是一个重载了 `operator()`(函数调用运算符)的类或结构体。这使得这个类的实例可以像函数一样被调用。 ```cpp struct Multiply { int operator()(int a, int b) const { return a * b; } }; // 使用时 Multiply multiply; int result = multiply(3, 4); // 就像调用函数一样使用 ``` 在上面的代码中,虽然 `Multiply` 是一个结构体,但由于它重载了 `operator()`,它就可以像函数一样使用。这种设计方式在 C++ 中非常常见,尤其是在需要传递行为而不是数据时。 ## 为什么叫“函数对象”? 称其为“函数对象”或“functor”,主要是因为这个对象的行为类似于函数。尽管它在形式上是一个类或结构体,但它封装了一个可调用的行为,这让它可以像函数一样工作。因此,尽管我们从传统的角度看它是一个结构体,但它的核心功能是“作为一个函数被调用”。 ## 从结构体到函数对象的转变 这实际上是 C++ 提供的一种灵活性,它允许你将行为(函数调用)和状态(成员变量)组合在一起。对于一些更老的代码库或传统编程风格中,可能会更习惯将这些称为“结构体”或“类”,而现在我们更倾向于从它们的功能上来命名。 ## 使用 `class` 的例子 无论你使用 `struct` 还是 `class`,只要你定义了 `operator()`,那么这个类或结构体就可以被称为“函数对象”(functor)。`struct` 和 `class` 在 C++ 中的区别只是默认访问权限不同: - **`struct`** 默认的访问权限是 `public`。 - **`class`** 默认的访问权限是 `private`。 所以,你的例子可以用 `class` 来实现,而且它的行为会与用 `struct` 实现的一模一样。 ```cpp class Multiply { public: // 记得在 class 中默认成员是 private,所以要显式声明为 public int operator()(int a, int b) const { return a * b; } }; // 使用时 Multiply multiply; int result = multiply(3, 4); // 结果是 12,就像调用函数一样使用 ``` 在这个例子中,`Multiply` 是一个 `class`,但它仍然是一个“函数对象”,因为它重载了 `operator()`,使得你可以通过 `Multiply` 的实例来调用它,就像使用一个函数一样。 无论你使用 `struct` 还是 `class`,只要你定义了 `operator()`,这个类型就可以作为“函数对象”使用。这种设计模式在 C++ 中非常灵活,允许你将数据和行为封装在一起。 ## 总结 - **结构体(struct)**:传统上用于存储数据。 - **函数对象(functor)**:是一个类或结构体,重载了 `operator()` 使其行为像函数一样。 从某种意义上讲,术语“函数对象”更强调它的功能,而不是它的形式(结构体或类)。不过,这确实需要一些适应,但了解其背后的逻辑可能会帮助你更容易接受这个概念。
admin
2024年8月28日 10:39
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码