如何定义从自定义迭代器到自定义const_iterator的隐式转换

时间:2015-02-19 16:28:04

标签: c++ c++11 stl iterator const-iterator

我正在写一个STL风格的树'容器类。我目前支持使用具有以下习语的单个类的const和非const迭代器:

template<typename T>
class Tree
{
public:

    using iterator = TreeIterator<T, false>;                                                        
    using const_iterator = TreeIterator<T, true>;

    // ...
};

TreeIterator就像这样:

template <typename T, bool is_const_iterator/* = true*/>
class TreeIterator : public std::iterator<std::forward_iterator_tag, T>
{    
public:

    // TreeNodePointer is either a const or non-const pointer depending on the template parameter.
    typedef typename std::conditional<is_const_iterator, const TreeNode<T>*, TreeNode<T>*>::type TreeNodePointer;

    // All the iterator interface and typedefs...

private:

    TreeNodePointer m_pointer;    // internal pointer.
};

问题是,要保持我的STL风格,insert_hintemplace_hint等操作应该将const_iterator参数作为输入,但我需要定义一个从iterator隐式转换为const_iterator,以便按用户的预期工作。

我非常确定从const iterator隐式转换为const_iterator应该可以,但我不确定语法是怎么做的。对我来说,在模板(或其他机制)上设置一些阻止const_iterator转换为iterator的条件也很重要。

如何定义这样的转换?

1 个答案:

答案 0 :(得分:4)

有两种方法可以编写隐式转换。

  1. const_iterator编写转换构造函数,其中包含iterator
  2. iterator编写转换为const_iterator
  3. 的转换函数

    在这种情况下,最简单的方法是编写转换函数:

    operator TreeIterator<T, true>() const { return /* ... */; }
    

    此函数将同时存在于TreeIterator<T, true>TreeIterator<T, false>中,但如果对象已经是TreeIterator<T, true>,则实际上永远不会使用此函数。相反的转换根本不可能,因为没有为它编写任何内容。