Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Может ли std::bind быть удобнее, чем лямбды?

#cpp #stl #boost #asio


Поковырялся с asio, и наткнулся вот на какой момент. Для привязки handle'ров к функциям
асинхронного чтения/записи используется bind: в примерах - из boost, я без особых проблем
заменил на stl. Например:

socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
      boost::bind(&udp_server::handle_send, this, message,
        asio::placeholders::error,
        asio::placeholders::bytes_transferred));


И ниже по тексту:

void handle_send(boost::shared_ptr /*message*/,
  const asio::error_code& /*error*/,
  std::size_t /*bytes_transferred*/)  {  }


Но в процессе "щупания" изрядную часть кода я переписал (в первую очередь для отвязки
от boost - шеф и на header-only версию asio смотрит косо). И везде намного удобнее
было написать лямбду:

socket_.async_send_to(asio::buffer(*message),remote_endpoint_,
                    [](const asio::error_code&,std::size_t){});


Поэтому вопрос такой: есть ли какие-то области применения, где std::bind или boost::bind
остаётся единственным или более удобным способом, чем лямбда-выражения? Стоит ли подробно
изучать bind, или достаточно на пальцах представлять, чтобы при необходимости разобраться
в чужом коде - а в своём он не понадобится?
    


Ответы

Ответ 1



Насколько мне кажется, по удобству синтаксиса создание функциональных объектов через std::bind и тому подобное проигрывает по выразительности лямбдам. Тем не менее, я бы всё равно разобрался в том, как работает std::bind (и даже попробовал бы реализовать его вручную, чтобы прочувствовать проблематику). Знания карман не тянут. Кроме этого, возможное применение старой функциональности: чтение и понимание чужого кода программирование под среду, которая имплементирует старый стандарт не исключено, что на вашей платформе старый метод будет производительнее, и это будет критично для вашего кода

Комментариев нет:

Отправить комментарий