现在,我有一个可以通过随机访问迭代器满足API要求的类。但是,我可以想象到这种实现会发生变化,只能提供前向迭代器。
因此,我想限制调用者使用随机访问功能。我知道我可以编写自己的实现(例如restricted_bar_iterator),但想知道是否有更简单的方法(即需要更少的编码)。
class BAR { ... };
class FOO {
public:
// Bad...clients may expect 'bar_iterator' to be random access...
typedef std::vector<BAR>::iterator bar_iterator;
bar_iterator begin_bar() const;
bar_iterator end_bar() const;
// Possible solution here!
class restricted_bar_iterator :
public std::iterator< std::forward_iterator_tag, BAR > { ... };
};
void baz()
{
FOO foo;
bar_iterator it = foo.begin_bar() + 5; // want a compile time error here!
}
vector::[const_]iterator
的公共继承和std::iterator_traits
的显式特化,因为这需要的代码最少。虽然这是可行的,但最好完全避免这种情况。 - Alexandre C.std::iterator<std::forward_iterator_tag, T>
并定义所有你需要的方法,这样它的行为就会和你期望的完全一致。 - andrevector<BAR>::iterator
是一个类类型,你仍然需要至少替换两个operator++
重载,否则它们将返回基础类型,并且仅特化iterator_traits
并不能阻止上面的代码尝试使用RandomAccessIterator操作,即使该类别为ForwardIterator。 - Jonathan Wakelyusing
指令。我发现这比手动继承std::iterator
并转发函数要清晰得多。关于vector::iterator
是否具有类类型的好点,但标准中可能有一些暗示。 - Alexandre C.std::vector<T>::iterator
是T*
。 - Dietmar Kühl