簡體   English   中英

轉發參數以進行后期初始化

[英]Forwarding parameters for late initialization

我正在嘗試構建一個通用的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();
    }
};

您可以執行以下操作:

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

您可以在類型中指定按引用還是按值保留哪些參數。

我正在嘗試構建一個通用的tcp_server模板,並且我想在創建連接后將一些參數轉發到客戶端類。 但是,客戶端對象的創建僅在連接后才進行,而不是在tcp_server構造期間進行。 如何將參數從tcp_server構造函數傳遞給客戶端構造函數?

復制或引用tcp_server的參數。 然后將這些參數傳遞給client_connection構造函數。

參數不應該被復制,只能被引用。

然后使用引用或指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM