我试图构建一个通用的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();
}
};
答案 0 :(得分:2)
您可以执行以下操作:
template<typename client_connection, typename... client_parameters>
class tcp_server
{
public:
template <typename... Ts>
explicit tcp_server(Ts&&... args) : client_params(std::forward<Ts>(args)...) {}
std::unique_ptr<client_connection> CreateClient()
{
return CreateClient(std::index_sequence_for<client_parameters...>{});
}
private:
template <std::size_t...Is>
std::unique_ptr<client_connection> CreateClient(std::index_sequence<Is...>)
{
return std::make_unique<client_connection>(std::get<Is>(client_params)...);
}
private:
std::tuple<client_parameters...> client_params;
};
然后有类似的东西:
using my_server_t = tcp_server<MyConnection, BigType&, int>;
您在类型中指定哪个参数通过引用或值保存。
答案 1 :(得分:0)
我试图构建一个通用的tcp_server模板,我想在创建连接后将一些参数转发到客户端类。但是,客户端对象创建仅在他已连接之后发生,而不是在tcp_server构造期间。如何将参数从tcp_server构造函数传递给客户端构造函数?
复制或引用tcp_server
中的参数。然后将这些参数传递给client_connection
构造函数。
不应复制参数,仅参考。
然后使用引用或指针。