Сопрограммы C ++ 20: реализация ожидаемого будущего

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

8
задан Nicol Bolas 10 March 2019 в 14:43
поделиться

1 ответ

Как вы упомянули сами, проблема в том, что future отошел от вызова .then(). Хитрость заключается в том, чтобы переместить его обратно, когда он будет готов. Это может быть сделано, если продолжение, переданное в .then(), принимает future, а не значение, которое оно содержит.

Вот функции, которые я взял из вашего кода и изменил. Я также изменил их с передачи вещей в std::async в качестве параметров, чтобы просто захватывать их, поскольку это выглядит более интуитивно для меня, но это не является важным изменением здесь.

    template <typename Work>
    auto then(Work&& w) -> co_future<decltype(w())> {
        return { std::async([fut = std::move(*this), w = std::forward<Work>(w)]() mutable {
            fut.wait();
            return w();
        })};
    }

    template <typename Work>
    auto then(Work&& w) -> co_future<decltype(w(std::move(*this)))> {
        return { std::async([fut = std::move(*this), w = std::forward<Work>(w)]() mutable {
            return w(std::move(fut));
        })};
    }

    void await_suspend(std::experimental::coroutine_handle<> ch) {
        then([ch, this](auto fut) mutable {
            *this = std::move(fut);
            ch.resume();
        });
    }

Кстати, VS2017 жалуется на наличие set_exception() и unhandled_exception() в типе обещания. Я удалил set_exception() и изменил unhandled_exception() на это:

    void unhandled_exception() {
        _promise.set_exception(std::current_exception());
    }
0
ответ дан Yehezkel B. 10 March 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: