gpt4 book ai didi

c++ - 为什么这个 ASIO 示例使用成员变量来传递状态而不是使用绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:29 25 4
gpt4 key购买 nike

ASIO HTTP Server 3 example有这样的代码:

void server::start_accept()
{
new_connection_.reset(new connection(io_service_, request_handler_));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error));
}

void server::handle_accept(const boost::system::error_code& e)
{
if (!e)
{
new_connection_->start();
}

start_accept();
}

本质上,new_connection_server 类的成员,用于将连接从start_accept 传递到handle_accept。现在,我很好奇为什么 new_connection_ 被实现为一个成员变量。

使用 bind 而不是成员变量来传递连接是否也有效?像这样:

void server::start_accept()
{
std::shared_ptr<connection> new_connection(new connection(io_service_, request_handler_));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error),
new_connection);
}

void server::handle_accept(boost::system::error_code const& error, std::shared_ptr<connection> new_connection)
{
if (!error) {
new_connection->start();
}
start_accept();
}

如果是这样,为什么该示例使用成员变量?是为了避免抄袭吗?

(注意:我对 ASIO 还不太满意,所以这里可能存在根本性的误解)

最佳答案

在使用 std::bind 创建的函数中传递 socket 变量与将其保留为 http::server3::server 中的成员变量大致相同。类(class)。使用 bindcreate temporaries而使用成员变量则不会。我认为这不是一个大问题,因为 std::shared_ptr 的复制成本并不高,示例中的代码路径也不是性能关键部分。

在编写自己的应用程序时,我发现自己同时使用了这两种技术。如果异步调用链很长,我通常会将变量保留为成员,以简化处理程序的函数签名并防止代码重复。对于较短的调用链,将状态变量保存在从 bind 创建的仿函数中更容易理解代码的逻辑。

关于c++ - 为什么这个 ASIO 示例使用成员变量来传递状态而不是使用绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16244096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com