std::bind() 是 C++11 标准库中的一个函数,用于创建一个可调用的对象,通常称为“绑定”。这个函数允许你绑定一个或多个函数的参数,以便在稍后的时间点调用它。
std::bind() 的常见用途包括:
延迟调用:绑定一个函数并稍后调用它。
部分应用/偏应用:绑定函数的部分参数,创建一个新的函数。
模拟高阶函数:将一个函数作为另一个函数的参数。
使用 std::bind() 需要包含 头文件。
语法
auto bound_object = std::bind(function_to_bind, arguments…);
function_to_bind 是要绑定的函数或可调用对象。
arguments… 是要绑定的参数。这些参数可以是任何可调用的对象,例如另一个函数、lambda 表达式或绑定对象。
例子1:绑定一个函数并传递部分参数。
#include <iostream>
#include <functional>
#include <thread>
#include <chrono>
void say_hello(int seconds, const std::string& name) {
std::this_thread::sleep_for(std::chrono::seconds(seconds));
std::cout << "Hello, " << name << "!\n";
}
int main() {
// 绑定 say_hello 并传递 2 秒和 "Alice" 作为参数。
auto bound_func = std::bind(say_hello, 2, "Alice");
bound_func(); // 调用 bound_func() 会等待 2 秒并输出 "Hello, Alice!"。
return 0;
}
例子2: 使用 std::placeholders:当你想绑定部分参数时,可以使用 std::placeholders::_N 来表示占位符。
#include <iostream>
#include <functional>
#include <thread>
#include <chrono>
#include <vector>
#include <algorithm>
void print_sum(int x, int y) {
std::cout << x + y << "\n";
}
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
auto bound_sum = std::bind(print_sum, std::placeholders::_1, 5); // 绑定第二个参数为 5。
std::for_each(nums.begin(), nums.end(), bound_sum); // 对于每个元素,输出它与 5 的和。
return 0;
}
例子3: 类的成员函数到一个对象的实例上
假设我们有一个类 MyClass,它有一个成员函数 show 和一个静态成员变量 message:
现在,我们创建一个 MyClass 的实例 obj,并使用 std::bind(this) 将其成员函数 show 绑定到该实例上:
#include <iostream>
#include <functional>
class MyClass {
public:
static const std::string message;
void show() {
std::cout << message << std::endl;
}
};
const std::string MyClass::message = "Hello from MyClass!";
int main() {
MyClass obj;
// 使用 std::bind(this) 绑定成员函数 show() 到 obj 的实例上
auto boundFunction = std::bind(&MyClass::show, &obj);
boundFunction(); // 输出: Hello from MyClass!
return 0;
}
在这个例子中, 创建了一个新的可调用对象 boundFunction。这个对象在被调用时会执行 obj.show()。所以,当我们调用 boundFunction() 时,它就像直接调用 obj.show() 一样工作。