void AsyncAcceptManaged(ManagerAcceptHandler mgrHandler) {
_acceptor.async_accept(_socket,
[this, mgrHandler](boost::system::error_code error) {
if (!error) {
try {
_socket.non_blocking(true);
mgrHandler(std::move(_socket));
} catch (boost::system::system_error const& err) {
TC_LOG_INFO("network", "Failed to initialize client's socket %s", err.what());
}
}
AsyncAcceptManaged(mgrHandler); // 遞歸重新監聽
});
}
// 類型定義
typedef void(*ManagerAcceptHandler)(tcp::socket&& newSocket);
tcp::acceptor _acceptor;
[this, mgrHandler](...){...} 是 C++11 引入的語法糖,編譯器將其轉換為帶有重載 operator() 的匿名函數對象類,捕獲列表決定成員變量。this 按值捕獲當前對象指針;mgrHandler 按值捕獲函數指針(可複製),確保回調生命期內有效。std::move(_socket) 將 socket 所有權轉移給上層處理器,避免拷貝開銷,符合 RAII 原則。AsyncAcceptManaged 實現持續接受新連接,典型的 Proactor 模式。system_error 防止異常拋出破壞 io_service 事件循環。boost::bind?C++11 Lambda 直接生成符合 CompletionToken 概念的可調用對象,類型推導自動匹配 async_accept 模板參數,比 bind 更直觀、類型安全、編譯錯誤信息更清晰。現代 Boost.Asio(1.66+)甚至引入 asio::bind_executor、use_awaitable 等更高級組合子,進一步簡化異步邏輯。