C ++:定义具有递归性质值的地图

时间:2017-08-26 18:45:16

标签: c++ dictionary

我想定义一个将字符串作为键的映射,但是该值将是一个以字符串为键的映射,但该值将是类似性质的映射,..最终,链中的最后一个映射将是从字符串到字符串的映射。

我试图将标记的JSON数据结构实现为值。

为了说明,以下是我可以提出的代码段:

typedef map<string, string> str2str;
typedef map<string, str2str> str2str2str;
...
typedef map<string, str2map_or_str> str2map_or_str;

C ++中的惯用方法是什么?

2 个答案:

答案 0 :(得分:3)

更惯用的解决方案IMO将使用允许递归类型定义的库。你基本上想要一棵树,每个叶子只是一个字符串。值得庆幸的是,boost::variant允许您定义递归变体:

using map_data = boost::make_recursive_variant<
                   std::string, 
                   std::map<
                     std::string, 
                     boost::recursive_variant_
                   >
                 >::type;

这是一个实用程序元函数,用于定义新的变体类型。它可以是std::stringstd::map std::stringmap_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对象捕获已解析的数据。