如何在我的代码中用 lambda 替换 std::bind

cod*_*der -1 c++ lambda bind c++11

鉴于以下代码:

#include <functional>
#include <iostream>

struct worker
{
   std::function<bool(std::string)> m_callback;

   void do_work(std::function<bool(std::string)> callback)
   {
      m_callback = std::bind(callback, std::placeholders::_1); // <--- replace this with lambda
      std::cout << "worker is working..." << std::endl;
      callback("worker is complete");
   }
};


// pretty boring class - a cut down of my actual class
struct helper
{
   bool work_callback(std::string str)
   {
      std::cout << "Helper: msg from worker: " << str << std::endl;
      return false;
   }
};


int main()
{
   helper the_helper;
   worker the_worker;

   std::cout << "Main: start\n";
   the_worker.do_work([&](std::string data){ return the_helper.work_callback(data); });
   std::cout << "Main: end\n\n";
}
Run Code Online (Sandbox Code Playgroud)

我想m_callback = std::bind...用 lambda替换。到目前为止,我有:

m_callback = [&](std::string data){ callback(data); };

这给了我错误:

#include <functional>
#include <iostream>

struct worker
{
   std::function<bool(std::string)> m_callback;

   void do_work(std::function<bool(std::string)> callback)
   {
      m_callback = std::bind(callback, std::placeholders::_1); // <--- replace this with lambda
      std::cout << "worker is working..." << std::endl;
      callback("worker is complete");
   }
};


// pretty boring class - a cut down of my actual class
struct helper
{
   bool work_callback(std::string str)
   {
      std::cout << "Helper: msg from worker: " << str << std::endl;
      return false;
   }
};


int main()
{
   helper the_helper;
   worker the_worker;

   std::cout << "Main: start\n";
   the_worker.do_work([&](std::string data){ return the_helper.work_callback(data); });
   std::cout << "Main: end\n\n";
}
Run Code Online (Sandbox Code Playgroud)

我不太确定如何在这里前进。你可以在这里看到我的完整尝试:https : //onlinegdb.com/SkaADi7u7

Kal*_*drr 5

void do_work(std::function<bool(std::string)> callback)
{
   m_callback = [&](std::string data){ callback(data); };

   std::cout << "worker is working..." << std::endl;
   callback("worker is complete");
}
Run Code Online (Sandbox Code Playgroud)

你的 lambda 调用callback你传递给它的函数,但不返回它的结果,这意味着它返回void,并且你不能将它分配给std::function<bool(std::string)>

在您的 lambda 中添加一个回报。

m_callback = [&](std::string data){ return callback(data); };
Run Code Online (Sandbox Code Playgroud)

  • 它当然会,更好的是 `m_callback = std::move(callback);` 也能工作。 (2认同)