Недавно я начал использовать Boost.Asio в проекте и хотел бы знать, знает ли кто-нибудь чистое решение для передачи права собственности на вновь созданный сокет на tcp::acceptor::async_accept, что, в свою очередь, передаст это право собственности на accept функция обработчика.
Заметьте, это не бессвязное желание, поскольку обработчик должен вызываться ровно один раз.
Я заметил, что не могу использовать std::bind() и std::unique_ptr‹> в качестве параметра, поскольку std::bind() требует, чтобы его параметры были CopyConstructible, и это правильно. Не только это, но и концепция AcceptHandler Boost также должна быть CopyConstructible.
Итак, мои варианты:
- Воспользуйтесь устаревшим способом std::auto_ptr‹> для перемещения объектов с помощью конструктора копирования, что может привести к непонятным ошибкам в новых выпусках Boost.Asio.
- Используйте std::shared_ptr‹> и у вас не будет возможности снять с указателя совместное владение, когда он больше не нужен, т.е. когда он достигает фактической функции обработчика (именно так работа выполняется в примерах в http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/examples.html насколько я читал).
or
- У тебя есть идея получше для меня.
Я в значительной степени в недоумении здесь. Кто-нибудь может просветить меня?