【问题标题】:Forwarding parameters for late initialization后期初始化的转发参数
【发布时间】: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&lt;client_parameters&amp;&gt; 可能会有所帮助。 client_parameters&amp;&amp;... 也是真正的右值引用,而不是转发引用。
  • @Jarod42 或std::forward_as_tuple(client_parameters....)?
  • “参数不应该被复制,只能被引用。”当客户端连接时如何保证它们是活动的?是否有更多的客户端应该接收相同的参数(不复制)?
  • 参数是不可变的,是单例的(创建服务器前创建,服务器销毁后销毁)但数据量大,所以我不想复制它们。

标签: c++ c++11 boost-asio shared-ptr


【解决方案1】:

您可以执行以下操作:

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>;

您在类型中指定哪些参数按引用或按值保存。

【讨论】:

    【解决方案2】:

    我正在尝试构建一个通用的tcp_server模板,并且我想在连接创建后将一些参数转发给客户端类。但是,客户端对象的创建仅在他连接之后发生,而不是在 tcp_server 构建期间发生。如何将参数从 tcp_server 构造函数传递给客户端构造函数?

    复制或引用tcp_server 中的参数。然后将这些参数传递给client_connection构造函数。

    参数不能复制,只能引用。

    然后使用引用或指针。

    【讨论】:

    • 我想同时使用 tcp_server 和 tcp_server。我想构建一个更抽象的模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多