我正在写一个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_hint
或emplace_hint
等操作应该将const_iterator
参数作为输入,但我需要定义一个从iterator
隐式转换为const_iterator
,以便按用户的预期工作。
我非常确定从const iterator
隐式转换为const_iterator
应该可以,但我不确定语法是怎么做的。对我来说,在模板(或其他机制)上设置一些阻止const_iterator
转换为iterator
的条件也很重要。
如何定义这样的转换?
答案 0 :(得分:4)
有两种方法可以编写隐式转换。
const_iterator
编写转换构造函数,其中包含iterator
。iterator
编写转换为const_iterator
。在这种情况下,最简单的方法是编写转换函数:
operator TreeIterator<T, true>() const { return /* ... */; }
此函数将同时存在于TreeIterator<T, true>
和TreeIterator<T, false>
中,但如果对象已经是TreeIterator<T, true>
,则实际上永远不会使用此函数。相反的转换根本不可能,因为没有为它编写任何内容。