目录
说明
std::bind是一个函数模板,用于创建一个可调用对象,该对象可以在稍后的时候被调用。bind的作用是将函数与参数绑定在一起,在调用时可以自动传入预定的参数值。
std::bind的基本语法如下:
template< class F, class... Args> /unspecified/ bind( F&& f, Args&&... args );
其中,F是需要绑定的函数或函数对象,Args是绑定函数所需的参数。
所以说可以认为bind是函数特殊引用
举例子:
cpp
void f(int& n1, int& n2, const int& n3)
{
std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
++n1; // 增加存储于函数对象的 n1 副本
++n2; // 增加 main() 的 n2
// ++n3; // 编译错误
}
int n1 = 1, n2 = 2, n3 = 3;
std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
n1 = 10;
n2 = 11;
n3 = 12;
std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
bound_f();
std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
输出如下,std::ref
和 std::cref
是 C++ 标准库中的两个实用工具,它们分别用于创建对对象的引用和常量引用的包装器
上面例子还可以改成下面,我们根据情况分布绑定
cpp
// using namespace std::placeholders;
auto bound_f = std::bind(f, _1, _2, std::cref(n3));
// _1是placeholders占位参数,可以之后传递
bound_f(n1, n2);
例子2
当然也可以 绑定lambda表达式、成员函数之类,与上面例子出入不大,这里举个stl的用例
cpp
void printValue(int& value) {
std::cout << "Value: " << value << std::endl;
}
int main() {
int x = 10;
std::vector<std::function<void()>> funcs;
// 使用 std::ref 包装 x 的引用,并将其存储在 funcs 中
funcs.emplace_back(std::bind(printValue, std::ref(x)));
// 调用函数,输出 "Value: 10"
funcs[0]();
return 0;
}