C++ 初始化std::variant的映射以表示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

作为学校项目的一部分,我必须读取JSON配置文件来填充自定义的
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"}}}}
}};