Вторая часть вопроса для меня самая интересная. Я предпочитаю помещать typedef
в классы, которые их используют, когда для них есть логическое место, даже если они используются в других классах. Но это вызывает некоторые проблемы с предварительными объявлениями (которые мы интенсивно используем для скорости компиляции).
Например, в одном недавнем проекте у нас был класс с именем Io
со встроенным typedef с именем Point
, который предназначен для очень читабельного кода - Io::Point
очень понятный и читаемый. Но всякий раз, когда мы хотели использовать тип, мы должны были включать объявление класса Io
, даже если все, что нам было нужно, это объявление Io::Point
, так как нет никакого способа (о котором я знаю) для прямого объявления тип, который находится внутри заранее объявленного класса.
В этом случае мы закончили с этим обоими способами. Мы создали глобальный тип IoPoint
, а затем typedef
d Io::Point
(так что наш уже написанный код не нужно было изменять). Не самый красивый ответ, но он сделал свою работу.
Что касается других частей:
Мы не используем никаких специальных соглашений для имен. Для карт мы часто используем * DescriptiveSomething *** Map ** (поскольку маловероятно, что мы когда-либо изменится с карты на какой-либо другой тип контейнера), но если DescriptiveSomething достаточно наглядно и не конфликтует с существующим именем, мы часто будем его использовать.
Как правило, мы не беспокоимся о создании typedef для итераторов, поскольку легко (и очень легко читаемо) просто использовать Type::iterator
или Type::const_iterator
. Тем не менее, мы делаем иногда печатаем их по умолчанию, если имя типа настолько длинное, что Type::const_iterator
делает код слишком "коротким". (Не знаю лучшего способа сказать это, но вы, наверное, знаете, о чем я.)
Мы создаем разные определения типов для каждого концепта, даже если два из них определяют один и тот же тип. Они могут меняться независимо друг от друга, поэтому наличие разных имен типов упрощает любой последующий рефакторинг. Во многих случаях это также делает код более читабельным.