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