在 boost async-tcp-echo-server示例中,有一个服务器类可以在新连接上创建会话:
acceptor.async_accept(socket, [this](boost::system::error_code ec) {
if (!ec)
std::make_shared<session>(std::move(socket))->start();
do_accept();
});
Run Code Online (Sandbox Code Playgroud)
session::start() 函数体:
void start() { do_read(); }
Run Code Online (Sandbox Code Playgroud)
session::do_read 方法是一个私有成员函数:
void do_read()
{
auto self(shared_from_this());
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec)
do_write(length);
});
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我。
会话类继承自,std::enable_shared_from_this因此在调用时已经创建了一个控制块,shared_from_this()并且不会发生未定义的行为。在do_read函数中,shared_from_this()函数用于允许do_write()对仍然存在于内存中的对象调用方法。如果shared_from_this()不使用该对象,则可以在到达范围结束时删除该对象。
为什么this在 lambda 表达式中被捕获?方法
是do_write()调用this还是self?
在 C++14 中,我可以替换:
auto self(shared_from_this());
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[this, self] ...
Run Code Online (Sandbox Code Playgroud)
和:
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[this, …Run Code Online (Sandbox Code Playgroud) 是否可以像在C++中一样在Java中完成参数转发:
template <typename ...Params>
void f(Params&&... params)
{
y(std::forward<Params>(params)...);
}
Run Code Online (Sandbox Code Playgroud)
例如,在我想要一个工厂功能的情况下:
public static MyClass create( < parameter pack > )
{
return new MyClass(< forward >);
}
Run Code Online (Sandbox Code Playgroud)
有多个构造函数?
值得注意的是,参数包可以包含不同类型的参数.