2 votes

Remplacement de C++ std::bind par des références à rvalue et des modèles varadiques à lambda

J'ai une fonction comme celle-ci pour un pool de threads simple pour mettre en file d'attente des tâches sur celui-ci, les signatures suivantes :

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

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

L'un pour les fonctions complexes qui ont un nombre quelconque de paramètres et l'autre est une référence rvalue pour une fonction simple, qui stocke le foncteur dans une file fixe comme ceci :

(Définition de EnqueueBasic)

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

(Définition de Enqueue)

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

Cela fonctionne parfaitement bien, mais je veux le remplacer par des lambdas, comment puis-je remplacer std::bind à un simple lambda ?, puisque j'essaie d'apprendre comment les lambdas C++ fonctionnent, mais cela me laisse un peu perplexe.

Merci.

2voto

0x499602D2 Points 36421

Cela ressemblerait à ceci. J'utilise std::invoke (C++17) pour être aussi générique que possible. Vous pouvez le remplacer par un appel direct si c'est tout ce dont vous avez besoin.

EnqueueBasic([&]{ return std::invoke(std::forward<Fn>(fn), std::forward<Args>(args)...); });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X