在构造函数初始化列表中使用 std::variant

Using std::variant in constructor initialization list

我正在尝试使用 std::variant 来概括我的一些代码。但是,我在调用构造函数时遇到 运行 问题。

我定义一个classTCPServer如下:

class TCPServer {
public:
    TCPServer(aio::io_context &io_context, std::variant<PlainServer, PIRServer>);

    std::variant<PlainServer, PIRServer> server_;

private:
    ...
};

而我定义classes PIRServerPlainServer如下:

class PlainServer : public TCPServer {
public:
    explicit PlainServer(aio::io_context& io_context);
    ...
private:
    ...
};

PlainServer::PlainServer(aio::io_context& io_context) :
    server_config_(server_config),
    TCPServer(io_context, this) {}

我省略了PIRServer因为这对理解问题没有帮助

我的IDE在PlainServer构造函数中强调了TCPServer的初始化,并说:"No matching constructor for initialization of 'TCPServer"。我使用 std::variant 不正确吗?

您的 variant 持有 PlainServerthis 是指向 PlainServer 指针 。你可能想要:

class TCPServer {
public:
    TCPServer(aio::io_context &io_context, std::variant<PlainServer*, PIRServer*>);
...
};


PlainServer::PlainServer(aio::io_context& io_context) :
    server_config_(server_config),
    TCPServer(io_context, std::variant<PlainServer*, PIRServer*>(this)) {}

变体的显式构造是必需的,因为它的单个 arg 构造函数是 explicit