Суффикс типа С++ _t, _type или none
С++ иногда использует суффикс _type
для определения типов (например, std::vector<T>::value_type
),
также иногда _t
(например, std::size_t
) или без суффикса (обычные классы, а также typedefs, такие как std::string
, который действительно std::basic_string<...>
)
Есть ли хорошие соглашения о том, когда использовать имя?
Ответы
Ответ 1
Как @MarcoA. ответ правильно указывает, суффикс _t
в значительной степени унаследован от C (и зарезервирован для POSIX).
Это оставляет нам "без суффикса" и _type
.
Обратите внимание, что имя пространства имен в std
не заканчивается на _type
*; все такие имена являются членами классов и шаблонов классов (или, в случае типов, связанных с регулярным выражением, вложенного пространства имен, которое в значительной степени играет роль класса). Я думаю, что различие: сами типы не используют суффикс _type
.
Суффикс _type
используется только для членов, которые обозначают типы, и, более того, обычно, когда они обозначают тип, несколько "внешний" для содержащего класса. Сравните std::vector<T>::value_type
и std::vector<T>::size_type
, которые исходят из параметров векторного шаблона T
и Allocator
, соответственно, против std::vector<T>::iterator
, который является "внутренним" для шаблона векторного класса.
* Не совсем верно, есть несколько таких имен (также отмечено в комментарии от @jrok): common_type
, underlying_type
, is_literal_type
, true_type
, false_type
. В первых трех случаях _type
на самом деле не является суффиксом, это фактическая часть имени (например, метафайла, дающая общий тип или базовый тип). С true_type
и false_type
это действительно суффикс (так как true
и false
являются зарезервированными словами). Я бы сказал, что это тип, который представляет истинное/ложное значение в смысле метапрограммирования на основе типа.
Ответ 2
В качестве наследия C символ _t
(который имел обыкновение означать через typedef
"), был унаследован (они также SUS/POSIX-reserved).
Типы, добавленные в С++ и не присутствующие в исходном языке C (например, size_type
), не нуждаются в сокращении.
Имейте в виду, что TTBOMK это скорее наблюдение за установленным соглашением, а не общее правило.
Ответ 3
Типы членов называются type
или something_type
в стандартной библиотеке С++. Это читаемо и описательно, и добавленная многословность обычно не является проблемой, потому что пользователи обычно не описывают эти имена типов: большинство из них используется в сигнатурах функций, тогда auto
заботится о типах возвращаемых функций-членов и в С++ 14 псевдонимы типа _t
заботятся о элементах статического типа типа trait.
Это приводит ко второму пункту: свободно стоящие, не-членные типы обычно называются something_t
: size_t
, int64_t
, decay_t
и т.д. Конечно, есть элемент наследия от C, но соглашение сохраняется в продолжающейся эволюции С++. Предположительно, лаконичность по-прежнему является полезным качеством здесь, поскольку ожидается, что эти типы будут описаны в целом.
Наконец, все вышеизложенное относится только к тому, что я могу назвать "родовым типом": Учитывая X
, дайте мне некоторый родственный тип X::value_type
или задайте целое число, дайте мне 64-битный вариант. Таким образом, конвенция ограничивается обычными именами типа словарного запаса. Названия классов вашей фактической бизнес-логики (включая std::string
), по-видимому, не гарантируют такой шаблон именования, и я не думаю, что многие люди хотели бы использовать каждое имя типа.
Если вы это сделаете, соглашения об именах _t
и _type
применяются в основном к стандартной библиотеке и к определенным аспектам стандартного стиля библиотеки, но вам не нужно воспринимать их как своего рода общий мандат.