лучший способ переместить / скопировать строку в операции asyn c? - PullRequest
1 голос
/ 04 мая 2020

Учитывая следующий пример, какой способ лучше всего переместить / скопировать / захватить строку для операций asyn c? передается как & в сеансе - хорошая идея?

void Client::connect(const std::string& hostname, const std::string& port, const std::string& string) {
  auto socket_ = std::make_shared<net::ip::tcp::socket>(_io_context);
  net::ip::tcp::resolver resolver_(_io_context);
  auto endpoints_ = resolver_.resolve(hostname, port);

  net::async_connect(*socket_, endpoints_, [socket_, string](sys::error_code ec, net::ip::tcp::endpoint) {
    if(!ec) {
      std::make_shared<Session>(std::move(*socket_), std::move(string))->start();
    }
  });
}

Session::Session(net::ip::tcp::socket socket, const std::string& string)
  : _socket(std::move(socket)), _string(std::move(string)) {

}

1 Ответ

1 голос
/ 04 мая 2020

Простая передача строки по значению и ее перемещение - это одновременно чисто и эффективно.

void Client::connect(const std::string& hostname, const std::string& port, std::string string) {
  auto socket_ = std::make_shared<net::ip::tcp::socket>(_io_context);
  net::ip::tcp::resolver resolver_(_io_context);
  auto endpoints_ = resolver_.resolve(hostname, port);

  net::async_connect(*socket_, endpoints_, [socket_, string{std::move(string)}](sys::error_code ec, net::ip::tcp::endpoint) mutable {
    if(!ec) {
      std::make_shared<Session>(std::move(*socket_), std::move(string))->start();
    }
  });
}

Session::Session(net::ip::tcp::socket socket, std::string string)
  : _socket(std::move(socket)), _string(std::move(string)) {

}

Обратите особое внимание на синтаксис в захвате лямбда, который позволяет перемещать объект в лямбда.

...