Как объявить функцию, которая будут принимать хэндлер, аналогичный асинхронным функциям boost.asio?

Я хочу написать метод, который будет инкопсулировать в себе некоторую логику работы с boost.Asio, но чтоб в этот метод можно было передать хэндлер, который, внутри метода, можно передать в асинхронную функцию boost asio(async_accept, async_send...).

Ниже приблизительный пример.

class Server{
   ...
   void StartAccept(... handler){
        ...
        acceptor.async_accept(socket, handler)
        ...
   }
   ...
}

Как я понял, async_accept принимает шаблонный тип, следовательно нужно ввести шалон, но какого плана и как. Иными словами, какого типа должен быть handler?


Ответы (1 шт):

Автор решения: V-Mor

Как уже заметил в комментарии @MaximTimakov, в документации описаны все 8 перегрузок данного метода и, конечно же, все типы, которые они принимают. Чтобы было проще, кликайте more... в описании перегрузки и там смотрите на раздел Example. В нём как раз показано, какого типа должен быть handler.

Если брать самый простой вариант (первую перегрузку), то handler должен быть указателем на функцию, возвращающую void и принимающую const boost::system::error_code&, то есть для Вашего примера это будет выглядеть так:

class Server{
   ...
   void StartAccept(... void (*handler)(const boost::system::error_code&)){
        ...
        acceptor.async_accept(socket, handler)
        ...
   }
   ...
}
→ Ссылка