news 2026/1/9 17:03:31

C++ 仿函数揭秘:让对象像函数一样被调用!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 仿函数揭秘:让对象像函数一样被调用!

🧩 C++ 仿函数揭秘:让对象像函数一样被调用!

大家好!今天我们来认识一个既神奇又实用的 C++ 特性——函数调用运算符operator()的重载

你可能想不到:

一个对象,居然可以直接“加括号”调用,就像函数一样

这种技术在 STL(标准模板库)中无处不在,比如sort的自定义比较器、priority_queue的优先级规则……它们背后,往往就是一个仿函数(Functor)!


🔑 什么是仿函数?

仿函数(Functor) =重载了()运算符的类对象

它看起来像函数,用起来像函数,但本质上是一个对象——这意味着它可以:

  • 拥有状态(成员变量)

  • 被模板参数传递

  • 比普通函数更灵活!


✅ 示例一:打印仿函数

来看你写的第一个例子:

class MyPrint { public: void operator()(string text) { cout << text << endl; } }; void test01() { // 重载的()操作符 也称为仿函数 MyPrint myFunc; myFunc("hello world"); }

这里,myFunc是一个MyPrint对象,但你可以像调用函数一样写:

myFunc("hello world");

编译器会自动调用myFunc.operator()("hello world")

是不是很像函数?但它其实是个有行为的对象


✅ 示例二:加法仿函数 + 匿名对象

再看你的第二个例子:

class MyAdd { public: int operator()(int v1, int v2) { return v1 + v2; } }; void test02() { MyAdd add; int ret = add(10, 10); cout << "ret = " << ret << endl; // 匿名对象调用 cout << "MyAdd()(100,100) = " << MyAdd()(100, 100) << endl; }

输出:

ret = 20 MyAdd()(100,100) = 200

注意这行:

MyAdd()(100, 100)
  • MyAdd()创建了一个匿名临时对象

  • 紧接着(100, 100)调用了它的operator()

  • 一行代码完成“创建 + 调用”,简洁又高效!


🌟 仿函数 vs 普通函数 vs Lambda

特性

普通函数

Lambda 表达式

仿函数(重载()

可携带状态

✅(通过捕获)

✅(成员变量)

可作为模板参数

✅(函数指针)

✅(类型安全)

性能

极高

(可内联)

可重复使用

通常一次

💡 正因如此,STL 大量使用仿函数(如greater<int>,less<string>)!


📌 关键特点总结

  • operator()可以接受任意数量、任意类型的参数(非常灵活!)

  • 返回值类型也由你决定(可以是voidint、自定义类型等)

  • 仿函数本质是对象,因此可以保存状态、继承、多态

  • 匿名对象 + 仿函数 = 一行实现“即用即弃”的逻辑


✅ 为什么叫“仿”函数?

因为它模仿函数的调用语法,但底层是对象的方法调用
这种设计巧妙地融合了面向对象函数式编程的优点。


如果你觉得这篇推文让你对 STL 的设计更理解了一层,欢迎点赞、收藏、转发!
也欢迎留言:“你用仿函数解决过什么实际问题?”


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 21:48:45

Java计算机毕设之基于JAVA+springboot技术的电商精准营销推荐系统设计及实现基于JAVA技术的电商精准营销推荐系统设计及实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2025/12/27 21:46:20

构建统一推理框架:TensorRT作为核心执行单元

构建统一推理框架&#xff1a;TensorRT作为核心执行单元 在当今AI系统部署的现实挑战中&#xff0c;一个常见困境是&#xff1a;模型在训练时表现优异&#xff0c;一旦进入生产环境却“水土不服”——延迟高、吞吐低、资源消耗大。尤其是在视频分析、自动驾驶或实时推荐等对性能…

作者头像 李华
网站建设 2025/12/27 21:39:59

大模型推理服务灰盒测试方法:结合TensorRT日志

大模型推理服务灰盒测试方法&#xff1a;结合TensorRT日志 在当前AI系统大规模落地的背景下&#xff0c;大语言模型和视觉模型正以前所未有的速度部署到生产环境中。然而&#xff0c;随着模型参数量突破百亿甚至千亿级别&#xff0c;推理延迟、吞吐瓶颈和资源消耗成为制约其实际…

作者头像 李华
网站建设 2025/12/27 21:38:57

大模型推理服务弹性定价:基于TensorRT成本核算

大模型推理服务弹性定价&#xff1a;基于TensorRT的成本核算 在当前AI服务大规模落地的背景下&#xff0c;大语言模型&#xff08;LLM&#xff09;正从实验室走向生产环境。然而&#xff0c;一个现实问题摆在所有云服务商和AI初创公司面前&#xff1a;如何让一次GPT级的文本生成…

作者头像 李华
网站建设 2025/12/27 21:38:50

Matlab速成笔记七十:使用多项式函数进行曲线拟合

1.说明 多项式的概念和在MATLAB中的表示方法上一篇Matlab自学笔记六十九&#xff1a;多项式求值、求根、积分和求导https://blog.csdn.net/freexyn/article/details/155579423?spm1011.2415.3001.5331已经讲过了&#xff0c;那么如何使用多项式函数方程式进行曲线数据拟合呢&…

作者头像 李华
网站建设 2025/12/27 21:38:32

TensorRT与gRPC协议集成实现高性能通信

TensorRT与gRPC协议集成实现高性能通信 在当今AI服务大规模落地的背景下&#xff0c;从智能摄像头到金融风控系统&#xff0c;再到医疗影像分析平台&#xff0c;越来越多的应用要求模型推理具备低延迟、高并发和强稳定性。然而&#xff0c;一个训练好的深度学习模型如果直接部署…

作者头像 李华