Страницы

Поиск по вопросам

суббота, 6 октября 2018 г.

Зачем нужен std::invoke?

Увидел сейчас, что в 17ом стандарте появилась новая шаблонная функция std::invoke. Очень сильно обрадовался, т.к. подумал, что это такой же invoke как в .NET, но поискав информацию о нём, так до конца и не понял, зачем он нужен. Я так понял, что он делает вызов функторов и лямбд, но чем это отличается от их прямого вызова? Может ли std::invoke делать этот вызов в определённом потоке, как это умеет делать его собрат из .NET?


Ответ

std::invoke нужен чтобы унифицированным образом вызвать функторы (в т.ч. лямбды), указатели на функции и указатели на функции-члены классов. Последние имеют специфический синтаксис вызова не совпадающий с синтаксисом обычных функторов:
(obj->*mem_fn_ptr)( args... );
Если вы пишите функцию типа std::async, и вам нужно реализовать поддержку всех callable объектов, то проще передать их одним пакетом в invoke, чем писать отдельную шаблонную реализацию для каждого случая. Такой синтаксический сахар.
Аналога .NET invoke в стандарте нет, потому что нет циклов обработки сообщений, и соответственно, "послать задачу в поток" невозможно. Воспользуйтесь std::async, либо std::thread, если нужно просто асинхронное выполнение, либо функциями WinAPI, либо функциями вашей оконной библиотеки (Qt, wxWidgets...), либо организуйте цикл обработки сообщений "вручную", и запихивайте упакованную задачу в соответствующую очередь.

Комментариев нет:

Отправить комментарий