news 2026/6/10 14:04:43

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:39:13

Vue项目中Axios全面封装实战指南

引言在现代前端开发中&#xff0c;HTTP请求是应用与后端交互的核心环节。Axios作为目前最流行的HTTP客户端库&#xff0c;以其简洁的API和强大的功能受到广泛青睐。然而&#xff0c;直接在项目中裸用Axios会导致代码冗余、维护困难等问题。本文将深入探讨如何在Vue项目中全面封…

作者头像 李华
网站建设 2026/6/10 1:00:24

YOLO11 Neck改进:引入密集连接DenseNet思想,在FPN/PANet的融合路径上,引入密集连接,让每个层都能接收到前面所有层的特征,增强特征流通

🎬 Clf丶忆笙:个人主页 🔥 个人专栏:《YOLOv11 全栈指南:基础到魔改实战 》 ⛺️ 努力不一定成功,但不努力一定不成功! 文章目录 一、YOLO11 Neck架构概述 1.1 YOLO11 Neck的基本结构与功能 1.2 FPN/PANet在YOLO11中的应用 1.3 传统特征融合方法的局限性 二、密集连…

作者头像 李华
网站建设 2026/6/10 2:31:57

使用TensorRT优化LayoutParser文档解析模型

使用TensorRT优化LayoutParser文档解析模型 在金融单据自动化处理、医疗病历数字化归档以及教育资料智能提取等实际场景中&#xff0c;一个共通的挑战浮出水面&#xff1a;如何从复杂排版的扫描件或PDF图像中快速而准确地识别出文本段落、表格、图表和标题等结构化区域。这类任…

作者头像 李华
网站建设 2026/6/10 11:38:30

Day50 PythonStudy

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np# 设置中文字体支持 plt.rcParams["font.family"] …

作者头像 李华
网站建设 2026/6/10 13:20:02

如何在ARM架构上运行TensorRT推理引擎?

如何在ARM架构上运行TensorRT推理引擎&#xff1f; 在智能摄像头、无人机和自动驾驶终端等边缘设备日益普及的今天&#xff0c;一个核心挑战摆在开发者面前&#xff1a;如何在算力有限、功耗敏感的硬件上实现高效、实时的AI推理&#xff1f;传统方案依赖云端处理&#xff0c;但…

作者头像 李华
网站建设 2026/6/10 13:23:50

NVIDIA Driver版本与TensorRT兼容性注意事项

NVIDIA Driver版本与TensorRT兼容性注意事项 在构建高性能AI推理系统时&#xff0c;一个看似基础却极易被忽视的问题正在悄悄影响着成千上万的部署项目&#xff1a;为什么同样的模型&#xff0c;在开发环境跑得飞快&#xff0c;一上线就报错或性能骤降&#xff1f; 答案往往藏在…

作者头像 李华