【发布时间】:2021-01-15 10:52:57
【问题描述】:
我正在为一些自定义容器(基于列表)实现一个简单的迭代器:
template <class T, class Link>
class single_iterator
{
public:
using iterator_category = std::forward_iterator_tag;
//A value is not T but T*, because the list is a contaner of elements of type T *.
using value_type = T *;
//Required by std::iterator_traits in GCC.
using difference_type = std::ptrdiff_t;
using pointer = value_type *;
using reference = value_type &;
single_iterator(Link *p) : pCur(p) {}
T * operator-> () const { return cur(); }
T * operator* () const { return cur(); }
single_iterator & operator++ ()
{
this->MoveNext();
return *this;
}
single_iterator operator++ (int)
{
single_iterator tmp = *this;
this->MoveNext();
return tmp;
}
bool operator == (const single_iterator & r) const
{
return this->link() == r.link();
}
bool operator != (const single_iterator & r) const
{
return !(*this == r);
}
private:
//! Results in undefined behavior if the iterator is end().
T * cur() const { return static_cast<T *>(pCur); }
void MoveNext() { pCur = pCur->next(); }
Link * link() const { return pCur; }
Link * pCur;
};
然后我在我的容器中声明iterator 和const_iterator 并实现begin() 和end():
template <class T, class Link, class Derived>
class container
{
public:
using value_type = T *;
using iterator = single_iterator<T, Link>;
using const_iterator = single_iterator<const T, const Link>;
iterator begin() { return first(); }
const_iterator begin() const { return first(); }
};
当我像这样使用迭代器时,它不会编译:
#include <iostream>
#include <vector>
struct A
{
void func()
{
container<A>::const_iterator i = m_v.begin();
}
container<A> m_v;
};
int main()
{
A a;
a.func();
return 0;
}
因为const_interator 不能从iterator 构造。
用最少的代码重复和为const_iterator 和iterator 定义单独的类来实现这种转换的正确方法是什么?
见the same code with std::vector。
EDIT1:这样的代码编译:
struct A
{
operator A() { return *this;}
};
int main()
{
A a;
return 0;
}
因此可以通过添加const 来定义类型转换运算符,const_iterator 将转换为自身。不过看起来有点奇怪……
【问题讨论】:
-
链接的重复提及转换中的一些答案从
iterator到const_iterator,但大多数没有,而且这个问题比这个问题更普遍。我不确定副本是否合适,但我不喜欢删除它,因为我已经发布了答案并且可能有偏见。 -
@FrançoisAndrieux 我想我添加了一条评论来解释哪些答案特别解决了它,但我现在看不到它。无论如何,尽管我认为这个问题是重复的,但您在下面的回答很好。
标签: c++