现在,我有一个类可以通过随机访问迭代器满足 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!
}
最佳答案
这是一个使用 Boost Iterator Adaptor 的例子.我用了int
而不是 BAR
.
#include <boost/iterator/iterator_adaptor.hpp>
#include <vector>
struct iterator :
public boost::iterator_adaptor<
iterator, // the name of our class, see docs for details
std::vector<int>::iterator, // underlying base iterator
boost::use_default, // for value type
boost::forward_traversal_tag // all the boilerplate for this!
>
{
// need this to convert from vector::iterator to ours
explicit iterator(std::vector<int>::iterator i)
: iterator::iterator_adaptor_(i) {}
};
int main()
{
std::vector<int> v;
iterator it(v.begin());
++it; // OK
it += 1; // ERROR
}
这有效地使用了 std::vector<T>::iterator
作为基类,但只允许为前向迭代器定义的操作。缺点是错误消息 - 它们不是很漂亮。
关于c++ - 我可以轻松地覆盖 (STL) 迭代器的类别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126008/