Замена C ++ std :: bind ссылками на rvalue и простыми шаблонами на лямбду - PullRequest
2 голосов
/ 05 мая 2019

У меня есть функция, подобная этой, для простого пула потоков для постановки задач на нее, следующие подписи:

        template<class Fn, class... Args>
        void Enqueue(Fn&& fn, Args&&... args);

        void EnqueueBasic(std::function<void()>&& task);

Одна для сложных функций, которые имеют любое количество параметров, а другая - ссылка на значение для простой функции, которая сохраняет функтор в фиксированной очереди следующим образом:

(определение EnqueueBasic)

        _pendingTasks.push_overflow(eastl::forward<PendingTask>(task));

(определение в очереди)

EnqueueBasic(std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...));

Это прекрасно работает, но я хочу заменить его на лямбды, как я могу заменить std::bind на простую лямбду ?, так как я пытаюсь научиться работать с лямбдами на С ++, но это меня немного смутило .

Спасибо.

1 Ответ

1 голос
/ 05 мая 2019

Это будет выглядеть так. Я использую std::invoke (C ++ 17), чтобы быть как можно более универсальным. Вы можете заменить его прямым звонком, если это все, что вам нужно.

EnqueueBasic([&]{ return std::invoke(std::forward<Fn>(fn), std::forward<Args>(args)...); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...