文章

C++bind

C++ std::bind 可将函数与部分参数绑定,生成新的可调用对象,实现参数预设、简化调用和延迟执行。

C++bind

C++ bind

std::bind 是 C++11 引入的一个函数适配器,用于创建一个可调用对象提前绑定部分参数(也叫“占位绑定”或“柯里化”)。

它的本质是返回一个新的函数对象,这个对象封装了原函数+部分参数,等到调用时再传入剩余参数。

基本语法

1
std::bind(可调用对象, 参数1, 参数2, ...)
  • 参数可以是具体值(代表绑定值)或占位符(代表保留参数)
  • 占位符使用 std::placeholders::_1_2 等来表示函数调用时传入的位置参数

典型示例

绑定普通函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <functional>
#include <cmath>  // 为了使用 std::pow

// 自定义的 power 函数,接收 double 类型参数
double power(double base, double exp) {
    return std::pow(base, exp);
}

int main() {
    // 通过 std::bind 固定指数为 3,形成一个 cube 函数
    auto cube = std::bind(power, std::placeholders::_1, 3.0);

    std::cout << "cube(2.0) = " << cube(2.0) << std::endl;  // 输出 8
    return 0;
}
  • pow(x, y) 的第二个参数绑定为 3.0
  • _1 是占位符,表示实际调用时传入第一个参数是 base
  • std::bind(power, _1, 3.0):生成一个一元函数 cube(x),等价于 power(x, 3.0)

绑定成员函数

1
2
3
4
5
6
7
8
9
10
11
struct Printer {
    void print(const std::string& msg) const {
        std::cout << "Message: " << msg << std::endl;
    }
};

int main() {
    Printer p;
    auto boundPrint = std::bind(&Printer::print, &p, std::placeholders::_1);
    boundPrint("Hello from bind!");  // 输出 Message: Hello from bind!
}
  • &Printer::print 是成员函数指针
  • &p 是对象指针
  • _1 表示实际调用时填入 print 的参数

适用场景

场景用途
1. 回调提前绑定部分参数,简化接口
2. 配合 std::function生成函数对象后便于统一封装
3. 用在算法中结合 STL 算法绑定操作函数
4. 类成员适配将成员函数转为可调用对象传递

与 Lambda 的对比

特性std::bindLambda
可读性稍复杂简洁明了
灵活性可绑定成员函数、占位符功能强,语法灵活
性能稍慢(可能生成复杂对象)一般更快,编译器优化好
推荐程度不如 Lambda 常用✅ 更现代、更推荐

补充:占位符 _1, _2 等解释

  • 来自 std::placeholders 命名空间
  • _1 表示调用时传入的第一个参数
  • _2 表示调用时传入的第二个参数
  • 多用于延迟传参或参数调换
本文由作者按照 CC BY 4.0 进行授权