Преобразование задачи‹T› в задачу‹void›

Есть ли способ упростить следующий код, чтобы избежать вызова .then, который «преобразует» мой task<int> в task<void>?

Я не могу изменить сигнатуру функции MyClass::MyFunction1, поскольку она является частью общедоступного API.

task<void> MyClass::MyFunction1()
{
    return MyFunction2().then([](int) {});
}

task<int> MyClass::MyFunction2()
{
    // Some code here
}

person K Mehta    schedule 30.03.2018    source источник
comment
Что такое .then?   -  person Drise    schedule 30.03.2018
comment
@Drise Функция-член concurrency::task   -  person Igor Tandetnik    schedule 30.03.2018


Ответы (1)


concurrency::task — это класс-шаблон, поэтому concurrency::task<int> и concurrency::task<void> — это два разных класса. Экземпляры одного из них не могут быть разыграны или преобразованы в другой.

Поэтому ваш подход в чем-то правильный. Однако вы не конвертируете, вы просто создаете новый экземпляр task<void>, который будет выполняться task<int>, возвращенным Method2(), после того, как это будет сделано. Это немного скрывает то, что вы на самом деле пытаетесь сделать, и может затруднить поддержку кода в будущем. Я бы подумал, что лучший подход - создать и вернуть task<void>, который инкапсулирует Method2() и ожидает его завершения:

concurrency::task<void> MyFunction1()
{
    return concurrency::task<void>{[]()
    {
        MyFunction2().wait();
    }};
}

Это немного более прямолинейно и чисто, особенно потому, что task<void>, которое получает вызывающий, фактически выполняет то, что выполняет MyFunction2().

В любом случае, поскольку типы несовместимы, невозможно создать новый экземпляр task<void>.

person Max Vollmer    schedule 31.03.2018