Christopher Kohlhoff
64448e6a19
Add any_completion_handler<>.
...
The any_completion_handler<> template can be used to type-erase
completion handlers. A typical use case is to enable separate
compilation of asynchronous operation implementations. For example:
// Header file:
void async_sleep_impl(
boost::asio::any_completion_handler<void(boost::system::error_code)> handler,
boost::asio::any_io_executor ex, std::chrono::nanoseconds duration);
template <typename CompletionToken>
inline auto async_sleep(boost::asio::any_io_executor ex,
std::chrono::nanoseconds duration, CompletionToken&& token)
{
return boost::asio::async_initiate<CompletionToken, void(boost::system::error_code)>(
async_sleep_impl, token, std::move(ex), duration);
}
// Separately compiled source file:
void async_sleep_impl(
boost::asio::any_completion_handler<void(boost::system::error_code)> handler,
boost::asio::any_io_executor ex, std::chrono::nanoseconds duration)
{
auto timer = std::make_shared<boost::asio::steady_timer>(ex, duration);
timer->async_wait(boost::asio::consign(std::move(handler), timer));
}
2022-11-01 11:00:16 +11:00