std :: async在成员字段的成员函数上

时间:2018-12-17 09:09:32

标签: c++ c++11

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

2 个答案:

答案 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;
}

这当然不是唯一的解决方案,也不是最佳的性能。