递归数据结构的前向声明

时间:2015-03-15 11:18:44

标签: c++ recursion data-structures

当我编写Delphi时,有一个TStringList基本上是Delphi通用TObject的字符串映射。使用这种结构,我可以通过在其中一个字符串键上放置另一个TStringList来轻松地创建一个递归的层次结构:

ParentStringList["somekey"] = "just a string value";
ParentStringList["anotherkey"] = SomeChildStringList;

问题是,我如何在C ++中实现同样的目标?

目前我所拥有的是:

typedef boost::variant< std::string, my_dictionary > my_variant;
typedef std::map < std::string, my_variant > my_dictionary;

......这显然是圆形的。

我可以不在结构中包装东西(我可以转发声明),或者不使用指针(编译器知道其大小)吗?

3 个答案:

答案 0 :(得分:3)

Boost.Variant documentation涵盖了这个确切的案例。如果不使用指针或其他类似的包装器,就无法做到。

答案 1 :(得分:0)

这种方法可行:

struct my_variant;
typedef map<string,my_variant> my_dict;
struct my_variant: variant<string, my_dict>
{};

但是有一些问题:

  • 这需要容器(具体为std::map),允许未完全定义的模板参数。使用C ++ 98,这是明确禁止的,我不确定这是否在以后的C ++版本中解除了。
  • 公开从容器中获取通常不是一个好主意,请自行研究原因以及它们如何适用于您的程序。使用包含而不是派生将是一种更安全的替代方法,或者是私有派生的中间方式,但这会打破这种方法提供的有用的IS-A关系。

答案 2 :(得分:-2)

尝试使用vectors。之前我曾将它们用作程序中外部数据库的内部表示,作为数据结构。