假设我有以下代码:
struct ReverseIterator : public Iterator {
ReverseIterator& operator++() {Iterator::operator--();}
ReverseIterator& operator--() {Iterator::operator++();}
ReverseIterator operator++(int) { /* ... */ }
ReverseIterator operator--(int) { /* ... */ }
}
如何调用基类,迭代器,后缀增量/减量运算符?我理解为了区分修复前和修复后,正在传递临时虚拟变量。如果是这种情况,我不能只调用Iteartor::operator++(1);
正弦1是一个整数吗?
答案 0 :(得分:5)
你可以,但你不应该这样做。 Postfix inc / dec运算符通常必须通过调用相应的前缀形式来实现。此外,基类运算符返回的值与类型不兼容,并且作为派生类运算符的结果将返回错误。
struct ReverseIterator : public Iterator {
ReverseIterator& operator++() {Iterator::operator--();}
ReverseIterator& operator--() {Iterator::operator++();}
ReverseIterator operator++(int)
{
ReverseIterator result = *this;
++(*this);
return result;
}
ReverseIterator operator--(int)
{
ReverseIterator result = *this;
--(*this);
return result;
}
}
我想你应该阅读这些问题: How to implement an STL-style iterator and avoid common pitfalls?
How can I implement various iterator categories in an elegant and efficient way?
答案 1 :(得分:3)
是的,您可以以正常方式使用这些运算符,如++iterator
(前缀)和iterator++
(后缀),但您可以直接调用它们,传递任何参数。如果您实际上并未在定义中的任何位置使用形式参数,则可以传递任何内容,通常为0
。
有时,参数用于递增某个值,如下所示:
i.operator++( 25 ); // Increment by 25.
但我不会称之为良好的编程风格。这些操作员不应该这样做,而且令人困惑。