【发布时间】:2018-02-15 17:28:51
【问题描述】:
我有 2 个保存不同数据的结构,每个都有一个方法可以将这些数据序列化为 JSON 字符串:
struct Struct1
{
Struct1(int value) : value(value){};
int value;
std::string ToJSON() const
{
std::string ret = "{value: " + std::to_string(value) + "}";
return ret;
}
};
struct Struct2
{
Struct2(std::string id, std::string image, std::string name) : id(id), image(image), name(name){};
std::string id;
std::string image;
std::string name;
std::string ToJSON() const
{
return "{id: " + id + " image: " + image + " name: " + name + "}";
}
};
我需要将其中的几个存储在一个容器中,以便以后迭代它们并从每个对象中获取 JSON 字符串。我使用std::variant 执行此操作。
std::vector<std::variant<Struct1, Struct2>> v3;
然后我可以像这样遍历容器:
auto GetJSONString = [](auto&& _in){return _in.ToJSON();};
for (const auto& nextV : v3)
{
auto test = std::visit(GetJSONString, nextV);
std::cout << test << " ";
}
std::cout << std::endl;
在我尝试使用braced-init-lists 填充向量之前,一切正常。
换句话说,这是有效的:
std::vector<std::variant<Struct1, Struct2>> v{Struct1(5), Struct2("someid", "someimage", "somename")};
但这不是:
std::vector<std::variant<Struct1, Struct2>> v4{ {13}, {"someid", "someimage", "somename"}};
在不工作的代码上,我收到以下编译器错误:
error: no matching function for call to 'std::vector<std::variant<Struct2, Struct1> >::vector(<brace-enclosed initializer list>)
我不明白这是为什么。在这种情况下我不能使用大括号初始化吗?如果是这样,……为什么?或者我是否需要以某种方式修改我的结构以支持这种初始化?
Here 是 wandbox.org 上的一个最小工作示例,以进一步说明我的问题。
【问题讨论】:
标签: c++ initialization variant c++17