将 C++ std::bind 替换为 lambda 的右值引用和可变参数模板

Replacing C++ std::bind with rvalue references and varadic templates to lambda

我有一个类似这样的函数,用于一个简单的线程池,用于在其上排队任务,以下签名是:

        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));

(Enqueue的定义)

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

它工作得很好,但我想用 lambda 替换它,我如何将 std::bind 替换为简单的 lambda?,因为我正在尝试学习 C++ lambda 的工作方式,但这仍然存在我有点困惑。

谢谢。

看起来像这样。我正在使用 std::invoke (C++17) 以尽可能通用。如果您只需要这样,您可以将其替换为直接调用。

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