我正在尝试创建一个小的接口函数,并将其发送到一个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,不幸的是不能使用其他标准。
发布于 2020-06-18 19:45:12
出现在脑海中的一个解决方案是使用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只有用字符串表示的数字。(然后通过解析来识别这一点,我认为您正在尝试将其建模为中间格式)。
https://stackoverflow.com/questions/62449141
复制相似问题