我正在实现一个简单的服务器后端,它可以与tcp和unix套接字一起工作。
下面是listener块:
static asio::awaitable<void> listener() {
const auto executor = co_await asio::this_coro::executor;
asio::local::stream_protocol::acceptor acceptor(executor, asio::local::stream_protocol::endpoint(socket_file_));
for (;;) {
auto socket = co_await acceptor.async_accept(asio::use_awaitable);
...
之后,通过使用此socket
创建Session
类的示例来初始化会话。
在这种情况下,socket
的类型为asio::local::stream_protocol::socket
,但在tcp情况下,类型为asio::ip::tcp::socket
。
它们都有一个基类asio::basic_stream_socket
,我想实现一个通用的Session
类:
template <typename Protocol, typename Executor>
class Session : public std::enable_shared_from_this<Session<Protocol, Executor>> {
using Socket = asio::basic_stream_socket<Protocol, Executor>;
public:
explicit Session(Socket sock) : socket_(std::move(sock)) {}
void start() {
co_spawn(socket_.get_executor(),
[self = this->shared_from_this()] { return self->reader(); },
asio::detached);
}
private:
Socket socket_;
asio::awaitable<void> reader() {
...
在这个实现中,我必须在listener
方法中显式地指定类型Protocol
和Executor
:
std::make_shared<Session<asio::local::stream_protocol, asio::any_io_executor>>(std::move(socket))->start();
或
std::make_shared<Session<decltype(socket)::protocol_type, decltype(socket)::executor_type>>(std::move(socket))->start();
看起来累赘和多余的东西。
有什么方法可以优化Session
类模板定义吗?
1条答案
按热度按时间hc2pp10m1#
作为一个免责声明,我对boost asio的异步会话一无所知,但是如果我正确理解了你的问题,你想简化对你的
Session
类的shared_ptr
的创建,而不必写出复杂的模板参数。一般来说,你可以使用一个模板化的自由工厂函数
create_session
来实现这一点,它可以从传入的参数中推导出它的模板参数,如下所示:一些注意事项:
create_session
的主体中仍然有一点模板混乱,但这被很好地隐藏了起来。Session
不需要从std::enable_shared_from_this
导出。Session
的构造函数是私有的。这是基于Session
示例只能通过工厂函数创建的假设。当然,这不是必需的。https://godbolt.org/z/qExz4WzKn