递归数据结构的前向声明
Forward declaration for recursive data structure
回到我写 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;
...这显然是圆形的。
我可以在不将内容包装在结构中(我可以转发声明),或者不使用指针(编译器知道其大小)的情况下执行此操作吗?
尝试使用 vectors。我以前在我的程序中将它们用作外部数据库的内部表示作为数据结构。
Boost.Variant documentation 涵盖了这个确切的案例。如果不使用指针或其他类似的包装器,您将无法做到这一点。
这种方法可行:
struct my_variant;
typedef map<string,my_variant> my_dict;
struct my_variant: variant<string, my_dict>
{};
虽然它有一些问题:
- 这需要允许未完全定义的模板参数的容器(特别是
std::map
)。使用C++98,这是明确禁止的,我不确定在以后的C++版本中是否取消了。
- 从容器公开派生通常不是一个好主意,请自行研究其原因以及它们如何应用于您的程序。使用包含而不是派生将是一个更安全的选择,或者私有派生的中间方式,但这打破了这种方法提供的有用的 IS-A 关系。
回到我写 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;
...这显然是圆形的。
我可以在不将内容包装在结构中(我可以转发声明),或者不使用指针(编译器知道其大小)的情况下执行此操作吗?
尝试使用 vectors。我以前在我的程序中将它们用作外部数据库的内部表示作为数据结构。
Boost.Variant documentation 涵盖了这个确切的案例。如果不使用指针或其他类似的包装器,您将无法做到这一点。
这种方法可行:
struct my_variant;
typedef map<string,my_variant> my_dict;
struct my_variant: variant<string, my_dict>
{};
虽然它有一些问题:
- 这需要允许未完全定义的模板参数的容器(特别是
std::map
)。使用C++98,这是明确禁止的,我不确定在以后的C++版本中是否取消了。 - 从容器公开派生通常不是一个好主意,请自行研究其原因以及它们如何应用于您的程序。使用包含而不是派生将是一个更安全的选择,或者私有派生的中间方式,但这打破了这种方法提供的有用的 IS-A 关系。