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

时间:2019-05-05 00:10:19

标签: c++ templates lambda rvalue-reference

我有一个像这样的功能,可以让一个简单的线程池在其上排队一个任务,以下签名是:

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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