将 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)...); });
我有一个类似这样的函数,用于一个简单的线程池,用于在其上排队任务,以下签名是:
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)...); });