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