Im ASIO HTTP Server 3 example gibt es Code wie folgt:Warum verwendet dieses ASIO-Beispiel members-Variablen, um den Status zu übergeben und nicht bind?
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();
}
Wesentlichen new_connection_
Mitglied der server
Klasse ist und verwendet wird, um eine Verbindung start_accept
-handle_accept
passieren. Jetzt bin ich neugierig, warum new_connection_
als Member-Variable implementiert ist.
Würde es nicht auch funktionieren, die Verbindung mit bind
statt einer Mitgliedsvariablen zu übergeben? Wie folgt:
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();
}
Wenn ja, warum verwendet das Beispiel Elementvariablen? Soll das Kopieren vermieden werden?
(Anmerkung: Ich bin nicht zufrieden mit ASIO noch und so kann es ein fundamentales Missverständnis hier)
Ich benutze oft beide Techniken und folge dem gleichen Ansatz wie Sam. Wenn ein Typ teuer zu kopieren ist oder die Variable in mehreren Ketten verwendet wird, verwende ich lieber eine Elementvariable, unabhängig von der Länge oder Einfachheit der einzelnen Aufrufketten. –