Вопрос
Когда нужно использовать asio_handler_invoke
для достижения чего-то, чего нельзя сделать, просто обернув обработчик?
Канонический пример, демонстрирующий случай, когда требуется asio_handler_invoke
, был бы идеальным.
Фон
В документах boost asio содержатся примеры использования asio_handler_invoke
здесь, но я не думаю, что это убедительный пример почему вы будете использовать обработчик вызова. В этом примере вы можете сделать такие изменения, как следующие (и удалить asio_handler_invoke
), и получить идентичный результат:
template <typename Arg1>
void operator()(Arg1 arg1)
{
queue_.add(priority_, std::bind(handler_, arg1));
}
Аналогично, в моем ответе, относящемся к отслеживанию обработчика, аналогичным образом не нужно использовать asio_handler_invoke
, несмотря на Tanner Sansbury's, предлагая использовать крючок вызова в качестве решения.
Этот поток в группе пользователей boost предоставляет дополнительную информацию - но я не понимаю значения.
Из того, что я видел, кажется, что asio_handler_invoke
всегда называется как asio_handler_invoke(h, &h)
, что, похоже, не имеет большого смысла. В каких случаях аргументы не были (по существу) копиями одного и того же объекта?
Конечная точка - я вызываю только io_service::run()
только из одного потока, так что может быть, я пропускаю что-то очевидное, исходящее из опыта в многопоточном цикле.