【发布时间】:2015-12-20 12:56:53
【问题描述】:
我正在尝试构建一个通用的tcp_server模板,并且我想在连接创建后将一些参数转发给客户端类。但是,客户端对象的创建仅在他连接之后发生,而不是在 tcp_server 构建期间发生。如何将参数从 tcp_server 构造函数传递给客户端构造函数?参数不能复制,只能引用。
下面的代码是我到目前为止建模的,但我不确定如何转发客户端对象参数。
template<class client_connection, typename... client_parameters>
class tcp_server
{
private:
tcp_server(const tcp_server&) = delete;
tcp_server& operator=(const tcp_server&) = delete;
boost::asio::io_service& io_service;
boost::asio::ip::tcp::acceptor acceptor;
boost::asio::ip::tcp::socket socket;
void start_accept()
{
acceptor.async_accept(socket, [this](const boost::system::error_code& ec)
{
if (!ec)
{
std::make_shared<client_connection>(io_service, std::move(socket), client_params)->start();
}
start_accept();
});
}
public:
tcp_server(boost::asio::io_service& io_service, const std::string& address, const std::string& service, client_parameters&&...client_params)
:
io_service(io_service),
acceptor(io_service),
socket(io_service)
{
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(address, service);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();
start_accept();
}
};
【问题讨论】:
-
std::tuple<client_parameters&>可能会有所帮助。client_parameters&&...也是真正的右值引用,而不是转发引用。 -
@Jarod42 或
std::forward_as_tuple(client_parameters....)? -
“参数不应该被复制,只能被引用。”当客户端连接时如何保证它们是活动的?是否有更多的客户端应该接收相同的参数(不复制)?
-
参数是不可变的,是单例的(创建服务器前创建,服务器销毁后销毁)但数据量大,所以我不想复制它们。
标签: c++ c++11 boost-asio shared-ptr