C++ 初始化std::variant的映射以表示JSON文件
作为学校项目的一部分,我必须读取JSON配置文件来填充自定义的C++ 初始化std::variant的映射以表示JSON文件,c++,variant,c++17,C++,Variant,C++17,作为学校项目的一部分,我必须读取JSON配置文件来填充自定义的Conf对象,该对象定义如下: struct ConfValue; using ConfObject = std::map<std::string, ConfValue>; using ConfArray = std::vector<ConfValue>; /** * Represents a configuration value. */ struct ConfValue { std::varian
Conf
对象,该对象定义如下:
struct ConfValue;
using ConfObject = std::map<std::string, ConfValue>;
using ConfArray = std::vector<ConfValue>;
/**
* Represents a configuration value.
*/
struct ConfValue {
std::variant<std::monostate, ConfObject, ConfArray, std::string, long long, double, bool> v;
};
/**
* Configuration (format influenced by JSON).
*/
using Conf = ConfObject;
它可以为我提供在真实配置文件中搜索内容的映射、每个字段的类型以及每个字段的默认值
我尝试使用大括号初始化来完成此操作,但无论我尝试什么,都无法编译:
Conf default_conf_{
{"port", ConfValue{4242}},
{"module", ConfValue{"modHeader"}},
{"modulePath", ConfArray{"../modules/", "./modules"}}
};
是我在C++中试图做的事情,如果是,怎么?p> 附带问题:是否可以在运行时获取std::variant的类型?
您可以使用:Conf default_conf {
{"port", ConfValue{4242LL}},
{"module", ConfValue{"modHeader"}},
{"modulePath", ConfValue{ConfArray{ConfValue{"../modules/"}, ConfValue{"./modules"}}}}
};
这里有两个独立的问题 首先,没有更多的帮助,
4242
将无法工作。您可以将其简化为:
std::variant<long long, bool> v = 4242; // error
您需要
ConfArray
来识别所有这些大括号的含义。如果您在ConfValue
中添加了一些构造函数,那么您也可以删除这些构造函数 旁白:你可能会得到这种类型的答案。@Jarod42谢谢!除了维护外部枚举外,你知道如何将其链接回类型吗?你想做什么variant::get_if
或std::visit
可能会有帮助。@Jarod42我使用boost属性树json解析器,它将所有数据存储为字符串。因此,如果我从json文件中解析“port”
,我将得到“4343”
作为字符串。我希望能够在我的default\u conf\u
的“port”
字段中获取变量的类型,这样我就可以将从json文件中获取的“4343”
转换为该类型,然后再将其放入最终的conf对象中。您可能需要这样的东西
std::variant<long long, bool> v = 4242; // error
Conf default_conf_{{
{"port", {4242LL}},
{"module", {"modHeader"}},
{"modulePath", {ConfArray{{"../modules/"}, {"./modules"}}}}
}};