我想实现一个自定义树类型(类似stl)和树的自定义迭代器。正如我对标准库的理解,任何容器只有4种类型的迭代器(const /非const,反向/非反向的组合),而const则是指它所拥有的数据,而不是容器本身。
由于某种原因,在我的迭代器类中,我有类型树的属性(我需要返回一个对它的const正确引用),这迫使我在用户创建一个const容器时使用不同的类型。
template <typename T> class tree;
template <typename T> class node;
template <typename T, typename Tree = tree<T>, typename Node = node<T>>
class iterator_base : public std::iterator<std::bidirectional_iterator_tag, T> {
protected:
Tree *tree;
Node *current_node;
public:
Tree& get_tree() const {
return *tree;
}
//...
};
是否有可能对const tree
和tree
使用相同的迭代器类型?
答案 0 :(得分:-1)
基本上你应该可以使用以下版本的迭代器:
0.5
唯一缺少的是从iterator到const_iterator的隐式转换(可以使用template_if或通过子类化并仅指定这些成员来完成。如果使用typedef iterator_base<T, tree<T>, node<T> > iterator;
//either use T or const T for const_iterator (depends on your definition
//of const correctness in this case.
typedef iterator_base<T, const tree<T>, const node<T> > const_iterator;
,则可能需要其他辅助函数来转换{ {1}}成const T
)
注意:只有在迭代器上没有直接修改树/节点的特殊非const成员时,此方法才有效(这样的方法将/不应该在const_iterator上工作)