Как использовать decltype в std :: future? - PullRequest
1 голос
/ 05 мая 2019

В этом коде, как я могу использовать decltype в std::future для определения типа возврата bar()?Хотя прямое использование std::future<int> работает, я хотел бы знать, как можно использовать decltype в такой ситуации.

#include <iostream>
#include <future>


int bar(int a)
{
    return 50;
}
int main()
{

    std::packaged_task<decltype(bar)> task(bar);

    //std::future<decltype(bar(int))> f = task.get_future(); //doesn't work need to do something like this

    std::future<int> f = task.get_future();   //works

    std::thread t1(std::move(task), 10);
    t1.detach();
    int val = f.get();
    std::cout << val << "\n";
    return 0;
}

Кроме того, правильно ли использовать decltype в std::packaged_task?

1 Ответ

3 голосов
/ 05 мая 2019

Обратите внимание, что вы можете использовать auto:

auto f = task.get_future();

И все работает как положено.


decltype используется для определения типа выражения.В этом случае bar(int) не является допустимым выражением.Вы можете использовать decltype(bar(0)).

В качестве альтернативы, вы можете использовать специальные инструменты для определения результата вызова функции.Поскольку вы пометили , вы можете использовать typename std::result_of<decltype(bar)*(int)>::type (конечно, вам нужно #include <type_traits>).


Для будущих читателей: я быхотелось бы ответить на этот вопрос в перспективе .result_of ожидает аргумент шаблона в форме F(Args...), который страдает, так как тип функции является типом возврата и крайне ограничен.В введено invoke_result, и оно намного лучше, чем result_of: std::invoke_result_t<decltype(bar), int>.Очень интуитивно понятно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...