Как я могу заменить std :: bind лямбда-кодом в моем коде - PullRequest
0 голосов
/ 10 сентября 2018

С учетом следующего кода:

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

Я хочу заменить 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

1 Ответ

0 голосов
/ 10 сентября 2018
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");
}

Ваша лямбда вызывает функцию callback, которую вы передаете ей, но не возвращает ее результат, то есть она возвращает void, и вы не можете присвоить ее std::function<bool(std::string)>.

Добавьте возврат в свою лямбду.

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