std::<key-value>不同类型的对向量

std::vector of <key-value> pairs with different types

本文关键字:向量 同类型 key-value lt std gt      更新时间:2023-10-16

我正在尝试创建一个小型接口函数并将其发送到JSON格式化程序类。 JSON 仅适用于(无限的(键值对,但值可以(仅(:string, int, bool

现在我有:

struct Data
{   
std::vector<std::pair<std::string, int64_t>> intData;
std::vector<std::pair<std::string, std::string>> strData;
std::vector<std::pair<std::string, bool>> boolData;
};
void func(const Data& data);

但我不太喜欢它(Data中有 3 个几乎相似的结构(,也许有更好的C++方法。

对我来说,理想情况下是有一些(模板化(更干净的东西并像这样工作:

// pseudocode, I know that it does not work
struct Data
{   // AnyType = string, int or bool
std::vector<std::pair<std::string, AnyType>> data;
};
// or better
using Data = std::vector<std::pair<std::string, AnyType>> data;
Data data;
data.add("int value", 1);
data.add("string value", "str");
data.add("bool value", false);
func(data);

谢谢

LE:我正在使用C++11,不幸的是不能使用其他标准。

我想到的一个解决方案是使用std::variant来获取编译时多态性,即:

std::vector< std::pair<std::string, std::variant<int64_t, std::string, bool>>>;

使用类型别名

using json_val = std::variant<int64_t, std::string, bool>;
std::vector< std::pair<std::string, json_val>>;

关于 json 和整体方法的说明:

如果不需要对类型进行中间区分,或者可能无法使用变体,则对所有值类型仅使用std::string可能会更简单。因为它是json,这可能是有意义的,因为json数据格式没有像int64_t这样的类型,即。JSON只有用字符串表示的数字。 (然后通过解析来识别这一点,我认为您正在尝试将其建模为中间格式(。