Прямо сейчас у меня есть класс, который может удовлетворить требованиям API с помощью итератора с произвольным доступом. Однако я могу представить себе ситуацию, когда реализация изменится, и может быть предоставлен только передовой итератор.Могу ли я легко переопределить категорию (it) итератора (STL)?
Поэтому я хотел бы ограничить абонентов от использования функции случайного доступа. Я знаю, что могу написать свою собственную реализацию (например, limited_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!
}
Я хотел бы попробовать труднее всего избежать этой ситуации, но я * действительно * хотел сделать это, я бы на общественном наследованию 'вектора :: [const_] iterator' и явная специализация' станд :: iterator_traits', потому что это то, что занимает наименьшее количество кода. Я не стану считать это ответом, потому что это действительно предпочтительнее, чтобы избежать этого полностью. –
Наследовать от 'std :: iterator' и определить все необходимые вам методы, чтобы он вел себя так, как вы ожидали. –
andre
@AlexandreC., Даже если 'вектор :: iterator' является типом класса, вам все равно нужно заменить, по крайней мере' оператор ++ два 'перегрузки, в противном случае они возвращают базовый тип, и только специализирующимся' iterator_traits' не останавливаются выше от попыток использовать операции RandomAccessIterator код, даже если категория говорит ForwardIterator –