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

Posted

技术标签:

【中文标题】如何在我的代码中用 lambda 替换 std::bind【英文标题】:How can I replace std::bind with a lambda in my code 【发布时间】:2018-09-10 08:15:01 【问题描述】:

给定以下代码:

#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";

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

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

这给了我错误:

main.cpp: In member function ‘void worker::do_work(std::function<bool(std::basic_string<char>)>)’:
main.cpp:19:18: error: no match for ‘operator=’ (operand types are ‘std::function)>’ and ‘worker::do_work(std::function)>)::’)
       m_callback = [&](std::string data) callback(data); ;

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

【问题讨论】:

我不明白你想在worker::do_work 中完成什么。你有一个std::function&lt;bool(std::string)&gt; 参数并且想要绑定一个参数......但是然后将它存储到另一个std::function&lt;bool(std::string)&gt;。这里不需要绑定(或 lambda) - 你可以做 m_callback = callback 像这样:m_callback = [&amp;](std::string const&amp; s) return callback(s);;coliru.stacked-crooked.com/a/bd452cc561100e2f? @code_fodder godbolt.org 用于装配检查,coliru.stacked-crooked.com 或 wandbox.org 用于运行。 尝试在do_work 之外致电m_callback 看看会发生什么...(我认为这将是段错误),[&amp;] 您正在通过引用捕获callback,但它是局部变量。 @code_fodder 好吧,您的问题实际上只是关于为什么那一行会导致错误。其他一切都无关紧要。理想情况下,当您尝试隔离错误或错误时,您可以将其归结为一个没有意义的语句或表达式。然后,您可以就该部分提出具体问题(或完全解决:通常减少问题的行为可以帮助您自己解决问题)。 【参考方案1】:
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");

您的 lambda 调用您传递给它的 callback 函数,但不返回它的结果,这意味着它返回 void,您不能将它分配给 std::function&lt;bool(std::string)&gt;

在您的 lambda 中添加一个返回值。

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

【讨论】:

当然可以,更好的是m_callback = std::move(callback); 也可以。 Hangon....你是说我什至不需要 lambda....一定要试试! @melpomene 是的.. 成功了! - 我想我不知道为什么要使用 bind 开始。也请张贴作为答案,我会赞成。但是这个答案确实回答了我的具体问题,所以感谢 Kaldrr @paler123...更好,对你的评论和我想的一样。虽然如果你能解释为什么这个举动真的对我有帮助:) 正如 rafix07 所说,您通过引用捕获了一个局部变量 (callback),当 do_work 返回时,该变量处于悬空状态。

以上是关于如何在我的代码中用 lambda 替换 std::bind的主要内容,如果未能解决你的问题,请参考以下文章

3D 数组到 3D std::vector

c++ 转换和 lambda - 替换 for 循环

如果是葡萄牙语,如何在 EditText 中用点替换逗号

在Java中用0替换Nan值[重复]

SQL Server:如何在表数据中用单引号查找和替换多引号

如何在标准函数 lambda c++ 11 中正确捕获参数包