我有一个像这样的功能,可以让一个简单的线程池在其上排队一个任务,以下签名是:
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的工作方式,但这仍然让我有点困惑。
谢谢。
答案 0 :(得分:1)
它看起来像这样。我正在使用std::invoke
(C ++ 17)来尽可能通用。如果需要,您可以将其替换为直接呼叫。
EnqueueBasic([&]{ return std::invoke(std::forward<Fn>(fn), std::forward<Args>(args)...); });