Я реализую пользовательский контейнер с STL-подобным интерфейсом. Я должен предоставить регулярный итератор и константный итератор. Большая часть кода для двух версий итераторов идентична. Как я могу избежать этого дублирования?
Например, мой контейнерный класс Foo
, и я реализую FooIterator
и FooConstIterator
. Оба итератора должны предоставлять такие методы, как operator++()
, которые идентичны.
Мой вопрос похож на Как удалить дублирование кода между аналогичными функциями const и non-const?, но ответ на этот вопрос специфичен для констант и неконстантные методы, особенно аксессоры. Я не вижу, как это может быть обобщено на проблему итератора.
Должен ли я получить FooIterator
из FooConstIterator
и расширять его с помощью дополнительных методов, отличных от const? Это либо приводит к скрытию виртуальных методов или методов, которые здесь кажутся неуместными.
Возможно, FooIterator
должен содержать FooConstIterator
. Хотя этот подход уменьшает дублирование реализации, он, похоже, повторно вводит множество определений методов шаблонов.
Существует ли умная технология шаблона для генерации двух итераторов из одного определения? Или, возможно, есть способ - содрогнуться - использовать препроцессор, чтобы искоренить эти почти одинаковые классы.
Я пробовал посмотреть мою локальную реализацию STL, чтобы увидеть, как она справляется с этим. Есть так много вспомогательных классов, что у меня проблемы с созданием дизайна, но похоже, что функциональность просто дублируется.
В предыдущих проектах мой пользовательский контейнер был построен поверх стандартного контейнера STL, поэтому мне не пришлось предоставлять свои собственные итераторы. Это не вариант в этом случае.