【发布时间】:2012-11-23 15:16:35
【问题描述】:
我想定义一个“节点”类/结构,然后在代码中声明这些节点的树,这样代码的格式化方式反映了树结构,并且没有“太多”样板路。
请注意,这不是关于数据结构的问题,而是关于我可以使用 C++ 的哪些特性来获得与以下示例类似的声明性代码风格。
可能使用 C++0X 这会更容易,因为它在构造对象和集合方面具有更多功能,但我使用的是 Visual Studio 2008。
示例树节点类型:
struct node
{
string name;
node* children;
node(const char* name, node* children);
node(const char* name);
};
我想做的事:
声明一棵树,使其结构反映在源代码中
node root =
node("foo",
[
node("child1"),
node("child2",
[
node("grand_child1"),
node("grand_child2"),
node("grand_child3"
]),
node("child3")
]);
注意:我不想做的事情:
声明一大堆临时对象/colls 并“向后”构造树
node grandkids[] = node[3]
{
node("grand_child1"),
node("grand_child2"),
node("grand_child3"
};
node kids[] = node[3]
{
node("child1"),
node("child2", grandkids)
node("child3")
};
node root = node("foo", kids);
【问题讨论】:
-
在我看来像是表达式模板的案例。
-
有人会认为
root("foo").child("child1).silbing("child2").child("grand_child1").silbing("grand_child2").grand_silbing("grand_child3").parent().silbing("child3")可以吗?这可以通过fluent interfaces 来完成,如果您愿意,可以添加一些换行符;) -
流畅的接口想法确实出现了,但我更喜欢“噪音”较小的东西 - 如果我可以将数组文字(子节点列表)作为参数传递给函数(节点构造函数)那么我相信这已经足够了,但我认为这是不可能的。
-
我什至愿意使用聪明的预处理器宏...
-
VS 2008 是否支持统一初始化?我没有足够关注他们的编译器。
标签: c++ visual-studio-2008 data-structures tree