std :: async для функции-члена поля-члена - PullRequest
0 голосов
/ 17 декабря 2018
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 голосов
/ 17 декабря 2018

Ладно, исправляя часть беспорядка (то есть добавляя все, что отсутствует), мы можем прийти к простому решению с использованием лямбда-функции:

#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;
}

Это, конечно, не единственное решение,ни лучший с точки зрения производительности.

0 голосов
/ 17 декабря 2018

Вам нужно назвать Bar::myMethod и передать (cv подходящее) Bar * или Bar &.Это будет выглядеть примерно так:

std::async(std::launch::async, &Bar::myMethod, bar.get());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...