我想定义一个将字符串作为键的映射,但是该值将是一个以字符串为键的映射,但该值将是类似性质的映射,..最终,链中的最后一个映射将是从字符串到字符串的映射。
我试图将标记的JSON数据结构实现为值。
为了说明,以下是我可以提出的代码段:
typedef map<string, string> str2str;
typedef map<string, str2str> str2str2str;
...
typedef map<string, str2map_or_str> str2map_or_str;
C ++中的惯用方法是什么?
答案 0 :(得分:3)
更惯用的解决方案IMO将使用允许递归类型定义的库。你基本上想要一棵树,每个叶子只是一个字符串。值得庆幸的是,boost::variant
允许您定义递归变体:
using map_data = boost::make_recursive_variant<
std::string,
std::map<
std::string,
boost::recursive_variant_
>
>::type;
这是一个实用程序元函数,用于定义新的变体类型。它可以是std::string
或std::map
std::string
到map_data
(标有特殊标记boost::recursive_variant_
)。就是这样。没有深度限制。
然后你的json_data类型只是以下别名:
using json_data = std::map<std::string, map_data>;
您可以在here上看到它。唯一需要注意的是,您需要重写代码才能使用boost::variant
访问者模式。但这不是一件难事。我敢说这个定义的递归本质使得逻辑几乎可以写出来。
答案 1 :(得分:1)
一种简单的方法是使用具有struct
和递归string
的{{1}}。
map
然后,您可以使用struct ParseData;
using MapValue = std::map<std::string, ParseData>;
struct ParseData
{
std::string string_value;
MapValue map_value;
};
对象或ParseData
对象捕获已解析的数据。