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