资讯动态

C++补充(二)--包装器:std::function 与 std::bind

发布时间:2026/10/22 21:00:09 来源:尧图企业网站定制
前言前面我们学习了 lambda 表达式lambda 本质是编译器自动生成的仿函数属于可调用对象。C 里面可调用对象种类很多普通函数、函数指针、仿函数、lambda、类成员函数。它们类型各不相同直接统一管理很麻烦。C11 在functional头文件提供了包装器std::function和std::bind用来统一封装、适配各类可调用对象。function 可调用对象包装器函数指针、仿函数、 lambda 等可调用对象的类型各不相同 std::function 的优势就是统 一类型对他们都可以进行包装这样在很多地方就方便声明可调用对象的类型语法function返回值类型(参数类型列表) 变量名可调用函数对于一些可以调用的普通函数,仿函数lambda对于成员函数静态成员函数静态成员函数没有 this 指针和普通全局函数一样。获取成员函数地址语法类名::函数名不能省略成员函数取地址要求。签名就是int(int,int)直接包装调用只传两个参数。普通成员函数普通成员函数内部可以访问对象的成员变量而成员变量存储在实例对象里面。 C 编译器给普通成员函数增加了一个隐藏参数this对象指针用来标记当前操作的是哪一个对象。 使用std::function包装成员函数时我们要手动把这个隐藏的 this 参数写在 function 签名的第一个位置调用的时候传入对象地址。 没有对象 /this 指针成员函数找不到成员变量无法运行。特性普通成员函数静态成员函数隐含this指针✅ 有❌ 无访问非静态成员✅ 可以❌ 不可以访问静态成员✅ 可以✅ 可以调用方式需通过对象类名::函数()或对象调用是否属于对象属于对象属于类能否为virtual✅ 可以❌ 不可以能否为const✅ 可以❌ 不可以无 thisbind 绑定器作用std::bind可以接收一个可调用对象绑定固定参数或者调整参数顺序生成一个全新的可调用对象。 配合占位符placeholders::_1、placeholders::_2来代表新函数的第 1、第 2 个参数。调用bind的一般形式auto newCallable bind(callable,arg_list); 其中 newCallable本身是一个可调用对象arg_list是一个逗号分隔的参数列表对应给定的callable的 参数。当我们调用newCallable时newCallable会调用callable并传给它arg_list中的参数。A. 调整参数顺序 (Parameter Reordering)代码中的sub2演示了这一点。原函数Sub(a, b)计算(a - b) * 10。代码auto sub2 bind(Sub, _2, _1);_2代表新函数的第 2 个参数。_1代表新函数的第 1 个参数。调用sub2(10, 20)。此时_1 10,_2 20。传递给原函数Sub的参数变成了Sub(20, 10)。结果(20 - 10) * 10 100。作用交换了传入参数的顺序。B. 绑定固定参数 (Binding Fixed Arguments)代码中的sub3演示了这一点也叫“部分应用” Partial Application。代码auto sub3 bind(Sub, 100, _1);第一个参数被固定为100。第二个参数保留占位符_1表示需要用户在调用时传入。调用sub3(20)。此处_1 20。实际调用的是Sub(100, 20)。结果(100 - 20) * 10 800。作用减少参数数量预设默认值。小练习计算复利

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑