递归数据结构的前向声明

Forward declaration for recursive data structure

本文关键字:声明 数据结构 递归      更新时间:2023-10-16

早在我写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;

。这显然是循环的。

我可以在不将内容包装在结构中(我可以转发声明)或不使用指针(编译器知道其大小)的情况下执行此操作吗?

Boost.Variant 文档涵盖了这种情况。如果不使用指针或其他类似的包装器,就无法做到这一点。

这种方法可以工作:

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

不过,它有一些问题:

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

尝试使用向量。我以前使用过它们作为程序内外部数据库的内部表示形式作为数据结构。