2016-11-08 22 views
6

Каковы наилучшие методы предотвращения дублирования кода при реализации пар классов, таких как iterator и const_iterator или аналогичные?Лучшая практика избежания дублирования кода при реализации классов итератора и const_iterator

  • Обычно ли реализуется итератор в терминах const_iterator, используя множество const_casts?
  • Использует ли какой-то класс признаков и в конечном итоге определяет итератор и const_iterator как разные экземпляры общего шаблона?

Это похоже на довольно распространенную проблему с каноническим решением, но я не нашел статей, посвященных этому.

+0

К сожалению, слишком широк. Много разных подходов. Наследование. Шаблоны. Не существует универсальной согласованной «лучшей практики». Каждый отдельный случай меняется. –

+0

Я предпочитаю шаблонный шаблон, параметризованный 'value_type',' pointer_type', 'reference_type'. Например: 'template class CustomIterator {};' 'typedef CustomIterator iterator_type;' 'typedef CustomIterator const_iterator_type;' –

+1

http://stackoverflow.com/questions/2150192/how- к-код избегать дублирования реализующих-сопзЬ-и-неконстантных-итераторов –

ответ

2

У меня нет опыта реализации итераторов, хотя я думаю, что это похоже на другие проекты. Рефакторинг общий код и т.д.

Глядя на GNU libstdc++'s реализации std::vector::iterator

#include <bits/stl_iterator_base_funcs.h> 
// ... 
template ... class vector : ... { 
    typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator; 
    typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator; 
};