class Foo
{
private:
std::unique_ptr<Bar>& bar;
int retVal;
std::future<int> myFuture = std::async(std::launch::async, &Foo::bar->myMethod, this);
Foo(std::unique_ptr<Bar>& bar_) : bar(bar_) {}
}
我认为这是对主题的总结,因为这不起作用。如何在myFuture
上启动Bar::myMethod
?
答案 0 :(得分:6)
您需要命名Bar::myMethod
,并传递一个{cv合适的)Bar *
或Bar &
。看起来像
std::async(std::launch::async, &Bar::myMethod, bar.get());
答案 1 :(得分:0)
好的,修复一些混乱(即添加所有丢失的东西),我们可以使用lambda函数获得一个简单的解决方案:
#include <future>
#include <iostream>
class Bar {
public:
int myMethod(void) {
std::cerr << "Hi!\n";
return 1;
}
};
class Foo {
private:
std::unique_ptr<Bar>& bar;
int retVal;
std::future<int> myFuture = std::async(std::launch::async, [this](void)->int{return bar->myMethod();});
public:
Foo(std::unique_ptr<Bar>& bar_) : bar(bar_) {}
};
int main(void) {
std::unique_ptr<Bar> bar = std::make_unique<Bar>();
Foo foo(bar);
return 0;
}
这当然不是唯一的解决方案,也不是最佳的性能。