Страницы

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

среда, 5 декабря 2018 г.

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

Поковырялся с 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, или достаточно на пальцах представлять, чтобы при необходимости разобраться в чужом коде - а в своём он не понадобится?


Ответ

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

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

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