C++11引入的std::function,可以说是函数调用机制上的一次质的飞跃。它不仅极大地简化了函数、函数指针、lambda表达式、仿函数(即重载了operator()的类对象)等各种可调用对象的统一管理和调用,也深刻体现了C++设计哲学中“泛化”和“类型擦除”的精髓。
一、什么是std::function?为什么C++11要引入它?
简单来说,std::function是一个“通用函数包装器”,它能存储任何符合特定函数签名的可调用对象,并且通过统一的接口调用它们。它的本质是一种**类型擦除(type erasure)**机制,隐藏了具体调用对象的类型细节,只暴露统一的调用接口。
在C++03时代,回调函数通常用函数指针实现,但函数指针只能指向具体的函数,且类型不安全,不支持存储lambda或仿函数。std::function的出现,解决了这些问题:
- • 多态调用:它支持存储函数指针、普通函数、lambda、仿函数、
std::bind绑定的表达式,甚至成员函数指针(配合std::bind); - • 类型安全:通过模板参数指定函数签名,保证调用参数和返回值类型一致;
- • 统一接口:调用方式一致,使用
operator()即可调用,无需关心底层实现。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
个人教程网站内容更丰富:(www.1217zy.vip/)