std::bind的用法
时间: 2023-07-08 08:43:15 浏览: 157
`std::bind`的用法如下:
1. 绑定函数对象的参数
使用`std::bind`可以绑定函数对象的参数,生成一个新的可调用对象。例如:
```c++
#include <iostream>
#include <functional>
void print(int a, int b) {
std::cout << a << ", " << b << std::endl;
}
int main() {
auto f = std::bind(print, 1, 2);
f(); // 输出:1, 2
return 0;
}
```
在这个示例中,我们使用`std::bind`将函数对象`print`和参数`1`、`2`绑定,生成了一个新的可调用对象`f`。当我们使用`f()`调用`f`时,实际上是调用了`print(1, 2)`。
2. 绑定函数对象的部分参数
使用`std::bind`还可以绑定函数对象的部分参数,生成一个新的可调用对象。例如:
```c++
#include <iostream>
#include <functional>
void print(int a, int b, int c) {
std::cout << a << ", " << b << ", " << c << std::endl;
}
int main() {
auto f = std::bind(print, 1, std::placeholders::_1, 3);
f(2); // 输出:1, 2, 3
return 0;
}
```
在这个示例中,我们使用`std::bind`将函数对象`print`和参数`1`、`3`绑定,同时将第二个参数绑定到了占位符`std::placeholders::_1`上。当我们使用`f(2)`调用`f`时,实际上是调用了`print(1, 2, 3)`。这里需要注意的是,占位符`std::placeholders::_1`表示在调用时将会传入的参数,可以有多个占位符,分别对应不同的参数。
3. 绑定成员函数
使用`std::bind`还可以绑定成员函数,生成一个新的可调用对象。例如:
```c++
#include <iostream>
#include <functional>
class A {
public:
void print(int a, int b) {
std::cout << a << ", " << b << std::endl;
}
};
int main() {
A a;
auto f = std::bind(&A::print, &a, 1, 2);
f(); // 输出:1, 2
return 0;
}
```
在这个示例中,我们使用`std::bind`将成员函数`A::print`和对象`a`、参数`1`、`2`绑定,生成了一个新的可调用对象`f`。当我们使用`f()`调用`f`时,实际上是调用了`a.print(1, 2)`。需要注意的是,使用成员函数时,需要在函数指针前加上取地址符`&`,同时需要将对象的指针作为第一个参数传递给`std::bind`。
4. 绑定函数对象和成员函数的共同部分
使用`std::bind`还可以绑定函数对象和成员函数的共同部分,生成一个新的可调用对象。例如:
```c++
#include <iostream>
#include <functional>
class A {
public:
void print(int a, int b) {
std::cout << a << ", " << b << std::endl;
}
};
void print(int a, int b) {
std::cout << a << ", " << b << std::endl;
}
int main() {
A a;
auto f = std::bind(print, std::placeholders::_1, 2);
auto g = std::bind(&A::print, &a, std::placeholders::_1, 3);
f(1); // 输出:1, 2
g(4); // 输出:4, 3
return 0;
}
```
在这个示例中,我们使用`std::bind`将函数对象`print`和参数`2`绑定,同时将第一个参数绑定到了占位符`std::placeholders::_1`上,生成了一个新的可调用对象`f`。当我们使用`f(1)`调用`f`时,实际上是调用了`print(1, 2)`。
同时,我们还使用`std::bind`将成员函数`A::print`和对象`a`、参数`3`绑定,同时将第一个参数绑定到了占位符`std::placeholders::_1`上,生成了一个新的可调用对象`g`。当我们使用`g(4)`调用`g`时,实际上是调用了`a.print(4, 3)`。
阅读全文