全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ ptr_fun与mem_fun的区别_C++函数适配器的历史与替代方案

ptr_fun用于包装普通函数指针,mem_fun用于包装成员函数指针,二者均为早期STL适配器;2. 因语法繁琐且功能受限,自C++11起被lambda、std::function和std::bind取代;3. C++17中正式移除,现代代码应使用lambda或bind替代。

在C++标准库中,ptr_funmem_fun 是早期用于适配函数指针和成员函数指针的函数适配器,主要用于配合STL算法使用。随着语言的发展,它们逐渐被更现代、更灵活的机制取代。理解它们的区别以及为何被淘汰,有助于掌握C++函数对象演进的历史脉络。

ptr_fun:普通函数指针的包装器

ptr_fun 用于将普通函数指针转换为函数对象(functor),以便能被STL算法接受。某些老式STL实现要求函数对象具有特定的类型特征(如result_type),而裸函数指针不具备这些typedef,因此需要包装。

示例:

假设有函数:
bool is_even(int n) { return n % 2 == 0; }
在旧式代码中,要传递给std::not1等适配器时需包装:
std::ptr_fun(is_even)
这会生成一个带类型定义的函数对象,支持绑定与取反操作。

mem_fun:成员函数的适配器

mem_fun 专门用于包装类的成员函数指针,使其能通过对象指针调用。常用于std::for_eachstd::transform等算法中对容器中对象指针调用成员函数。

示例:

对于类:
class Task { public: void run(); };
容器std::vector时,可使用:
std::for_each(tasks.begin(), tasks.end(), std::mem_fun(&Task::run));
它会自动解指针并调用成员函数。

C++还提供mem_fun_ref用于对象引用的场景,适用于存储实际对象而非指针的容器。

历史局限与替代方案

上述适配器在C++98/03时代是必要的,但存在明显缺陷:

  • 语法繁琐,需显式指定模板参数或依赖重载解析
  • 不支持任意可调用对象(如仿函数、lambda)
  • 对参数数量敏感,有mem_funmem_fun1等变体

从C++11开始,以下现代机制全面替代了它们:

  • Lambda表达式:最直接的方式,可捕获上下文并内联定义逻辑
  • std::function:统一封装任意可调用对象
  • std::bind:灵活绑定函数与参数,包括成员函数
  • 自动类型推导(auto):简化函数对象的使用

现代替代示例:

用lambda调用成员函数:
std::for_each(tasks.begin(), tasks.end(), [](Task* t) { t->run(); });
或使用bind:
std::for_each(tasks.begin(), tasks.end(), std::bind(&Task::run, std::placeholders::_1));

在C++17中,ptr_funmem_fun 已被正式移除。编译器虽可能仍支持出于兼容性考虑,但不应再使用。

基本上就这些。老式适配器是特定历史阶段的产物,理解它们有助于阅读旧代码,但在新项目中应优先使用lambda和std::bind。


# c++  # 区别  # typedef  # 标准库  # 封装  # 成员函数  # auto  # bool  # int  # void  # Lambda  # 指针  # class  # public  # function  # 对象  # transform  # 算法  # 绑定  # 移除  # 已被  # 但在  # 均为  # 适用于  # 使其  # 不支持  # 不应  # 而非 


相关文章: 制作网站公司那家好,网络公司是做什么的?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何访问已购建站主机并解决登录问题?  企业微网站怎么做,公司网站和公众号有什么区别?  电商网站制作公司有哪些,1688网是什么意思?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  网站图片在线制作软件,怎么在图片上做链接?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何通过虚拟主机空间快速建站?  建站之星后台密码如何安全设置与找回?  实例解析Array和String方法  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  小程序网站制作需要准备什么资料,如何制作小程序?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何在景安服务器上快速搭建个人网站?  视频网站制作教程,怎么样制作优酷网的小视频?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在Ubuntu系统下快速搭建WordPress个人网站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何在阿里云购买域名并搭建网站?  建站之星后台密码遗忘?如何快速找回?  如何在西部数码注册域名并快速搭建网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  大连网站制作公司哪家好一点,大连买房网站哪个好?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  建站主机是什么?如何选择适合的建站主机?  音乐网站服务器如何优化API响应速度?  如何在企业微信快速生成手机电脑官网?  已有域名能否直接搭建网站?  如何快速打造个性化非模板自助建站?  开源网站制作软件,开源网站什么意思?  建站10G流量真的够用吗?如何应对访问高峰?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何快速搭建支持数据库操作的智能建站平台?  湖北网站制作公司有哪些,湖北清能集团官网?  临沂网站制作公司有哪些,临沂第四中学官网?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  代刷网站制作软件,别人代刷火车票靠谱吗?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  太原网站制作公司有哪些,网约车营运证查询官网?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何快速搭建高效可靠的建站解决方案?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。