我有一个类(简化时)如下所示:
class TreeNode
{
ptrdiff_t sibling_offset, first_child_offset;
public:
long whatever;
// ...
};
树节点必须包含偏移量而不是指针,因为它们需要能够嵌入到容器中(如std::vector
),这些容器可以在必要时重新分配它们的存储空间,而不必花时间重新链接所有节点。
现在,如果我有一个适当定义的类TreeIterator<Iter>
(可能定义为 a friend
of TreeNode
),其工作是迭代 aTreeNode
的孩子,那么我的类的任何 STL 风格的客户端都应该能够使用它来迭代 a 的孩子标准 STL 方式的节点:
typedef std::vector<TreeNode> Tree;
Tree tree = ...;
TreeIterator<Tree::iterator> const root = tree.begin();
for (TreeIterator<Tree::iterator> i = root->begin(); i != root->end(); ++i)
{
foo(i->whatever);
process_further(i);
}
问题是,root->begin()
这是不可能的,因为TreeNode
它对它所在的容器一无所知。
(它不应该!它唯一关心的是容器有合适的迭代器。)
然而,我( 的作者TreeNode
)是唯一可能如何迭代其子代的人。
如何在不限制TreeNode
可存储 a 的容器类型的情况下解决此问题?
显然,如果我强制用户使用,这很容易std::vector
,但他应该可以自由使用任何符合 STL 的容器。