Подтвердить что ты не робот

Суффикс типа С++ _t, _type или none

С++ иногда использует суффикс _type для определения типов (например, std::vector<T>::value_type), также иногда _t (например, std::size_t) или без суффикса (обычные классы, а также typedefs, такие как std::string, который действительно std::basic_string<...>)

Есть ли хорошие соглашения о том, когда использовать имя?

4b9b3361

Ответ 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 применяются в основном к стандартной библиотеке и к определенным аспектам стандартного стиля библиотеки, но вам не нужно воспринимать их как своего рода общий мандат.