Как использовать std:: async для функции-члена?
Как я могу использовать вызов std:: async для функции-члена?
Пример:
class Person{
public:
void sum(int i){
cout << i << endl;
}
};
int main(int argc, char **argv) {
Person person;
async(&Person::sum,&person,4);
}
Я хочу позвонить, чтобы суммировать async.
Person p;
call async to p.sum(xxx)
Я не понял, могу ли я сделать это с помощью std:: async.
Не хотите использовать boost.
Поиск однострочного асинхронного вызова.
Ответы
Ответ 1
Что-то вроде этого:
auto f = std::async(&Person::sum, &p, xxx);
или
auto f = std::async(std::launch::async, &Person::sum, &p, xxx);
где p
- это экземпляр Person
, а xxx
- int
.
Эта простая демонстрация работает с GCC 4.6.3:
#include <future>
#include <iostream>
struct Foo
{
Foo() : data(0) {}
void sum(int i) { data +=i;}
int data;
};
int main()
{
Foo foo;
auto f = std::async(&Foo::sum, &foo, 42);
f.get();
std::cout << foo.data << "\n";
}
Ответ 2
Есть несколько способов, но я считаю наиболее ясным использование лямбда, например:
int i=42;
Person p;
auto theasync=std::async([&p,i]{ return p.sum(i);});
Это создает std::future
. Для полного примера этого, у меня есть полный пример, включающий асинхронную настройку mingw здесь:
http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds
Вам нужно убедиться, что p является потокобезопасным и что ссылка & p действительна до тех пор, пока не будет соединена асинхронная связь. (Вы также можете удерживать p с общим указателем или в С++ 14, unique_ptr или даже перемещать p в лямбда.)