如何将变体类型类成员初始化为monostate及构造对应node对象
如何将C++中variant类型的类成员初始化为monostate?
针对你给出的node类代码,要构造data为monostate的对象,有两种直接可行的方案:
方案1:添加专用于monostate的构造函数
在node类的public区域新增一个不需要传入data参数的构造函数,直接将data初始化为std::monostate:
#include <variant> #include <string> #include <deque> // 假设header、timePoint、timeDuration已提前定义 class node : public header { using value_type = std::variant<std::monostate, std::string, std::deque<std::string>>; value_type data; public: // 新增构造函数,专门初始化monostate node(timePoint since_, timeDuration timeout_) : header(since_, timeout_), data(std::monostate{}) {} template <typename T> node(timePoint since_, timeDuration timeout_, T data_) : header(since_, timeout_), data(data_) {} ~node() = default; inline value_type &get_data() { return data; }; };
构造对象时直接调用这个重载:
// 假设已创建合法的timePoint和timeDuration实例 node monostate_node(since_time, timeout_duration);
方案2:显式传入std::monostate{}作为参数
利用现有的模板构造函数,直接把std::monostate{}作为第三个参数传入,模板会自动推导类型:
node monostate_node(since_time, timeout_duration, std::monostate{});
注意事项
- 必须包含
<variant>头文件,否则std::monostate和std::variant无法被编译器识别 - 由于你的
variant第一个备选类型就是monostate,如果类存在默认构造函数,data会自动默认初始化为monostate,但当前类没有默认构造,因此需要用上述两种方式显式处理
内容的提问来源于stack exchange,提问作者Rodrigo Belli
相关产品推荐
相关产品推荐

