std::async 中如何传入一个类的成员函数?
时间: 2024-09-13 21:14:15 浏览: 51
在C++中,`std::async`是一个强大的函数,用于异步地执行一个任务。如果你想将一个类的成员函数作为参数传递给`std::async`,你需要使用`std::bind`或者lambda表达式来创建一个可调用的对象,这个对象包含了成员函数的指针和类的实例的指针。
具体来说,你可以使用`std::bind`将类的成员函数和类的实例绑定在一起,然后将这个可调用的对象传递给`std::async`。例如,如果你有一个名为`Person`的类,并且它有一个名为`sum`的成员函数,你可以这样做:
1. 首先,创建一个`Person`类的实例。
2. 然后,使用`std::bind`将`Person::sum`和`Person`的实例绑定在一起。
3. 最后,将这个可调用的对象传递给`std::async`。
代码如下:
```cpp
#include <future>
#include <iostream>
#include <functional>
class Person {
public:
void sum(int i) {
std::cout << i << std::endl;
}
};
int main() {
Person person;
auto func = std::bind(&Person::sum, &person, std::placeholders::_1);
std::future<void> fut = std::async(std::launch::async, func, 4);
// Do other stuff...
fut.get(); // Wait for the task to finish and get its result
return 0;
}
```
在这个例子中,`std::bind`创建了一个可调用的对象`func`,这个对象包含了`Person::sum`的指针和`Person`的实例的指针。然后,这个可调用的对象被传递给了`std::async`,这样就可以异步地执行`Person::sum`了。
需要注意的是,`std::async`返回的是一个`std::future`对象,这个对象可以用来获取异步任务的结果。在这个例子中,由于`Person::sum`没有返回值,所以`std::future`的类型是`void`。如果成员函数有返回值,那么`std::future`的类型应该是那个返回值的类型。
阅读全文