Поковырялся с 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
Но в процессе "щупания" изрядную часть кода я переписал (в первую очередь для отвязки от 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 (и даже попробовал бы реализовать его вручную, чтобы прочувствовать проблематику). Знания карман не тянут.
Кроме этого, возможное применение старой функциональности:
чтение и понимание чужого кода
программирование под среду, которая имплементирует старый стандарт
не исключено, что на вашей платформе старый метод будет производительнее, и это будет критично для вашего кода
Комментариев нет:
Отправить комментарий