我想定义一个“节点”类/结构,然后在代码中声明这些节点的树,使代码格式化的方式反射(reflect)树结构,并且没有“太多”样板的方式。
请注意,这不是关于数据结构的问题,而是关于我可以使用哪些 C++ 功能来获得与以下示例类似的声明式代码风格的问题。
可能使用 C++0X 这会更容易,因为它在构建对象和集合方面具有更多功能,但我使用的是 Visual Studio 2008。
示例树节点类型:
struct node
{
string name;
node* children;
node(const char* name, node* children);
node(const char* name);
};
我想做什么:
声明一棵树,使其结构反射(reflect)在源代码中
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);
最佳答案
如果您不介意过度复制节点并使用圆括号 ()
而不是方括号 []
那么这应该可行。
实际上,您可以通过将指针存储在node_group
中而不是复制来避免复制,但由于这是星期五下午,我很懒,所以我会把它留给您。
struct node
{
std::string name;
std::vector<node> children;
node(const char* n)
: name (n)
{
}
node(const char* n, const class node_group& group);
};
struct node_group
{
std::vector<node> children;
};
node::node(const char* n, const class node_group& group)
: name (n)
, children (group.children)
{
}
node_group operator ,(const node& n1, const node& n2)
{
node_group group;
group.children.push_back (n1);
group.children.push_back (n2);
return group;
}
node_group operator ,(const node_group& gr, const node& n2)
{
node_group group (gr);
group.children.push_back (n2);
return group;
}
int main ()
{
node root ("foo",
(node("child1"),
node("child2",
(node("grand_child1"),
node("grand_child2"),
node("grand_child3"))
),
node("child3"))
);
}
关于c++ - 如何填充 'Tree' 结构 'Declaratively',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531761/