Определения типов
Тип является синонимом для специализации шаблона integral_constant .
Пример
#include #include int main()
false_type == false true_type == true
Определение типа true_type
Содержит целочисленную константу со значением true.
typedef integral_constant true_type;
Замечания
Тип является синонимом для специализации шаблона integral_constant .
Пример
// std__type_traits__true_type.cpp // compile with: /EHsc #include #include int main()
false_type == false true_type == true
См. также
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе https://aka.ms/ContentUserFeedback.
Отправить и просмотреть отзыв по
Type traits c что это
Определяет шаблоны для констант времени компиляции, которые предоставляют сведения о свойствах аргументов типа или создают преобразованные типы.
Синтаксис
#include
Замечания
Классы и шаблоны в используются для поддержки вывода типов, классификации и преобразования во время компиляции. Они также используются для обнаружения ошибок, связанных с типом, и для оптимизации универсального кода. Унарные признаки типов описывают свойство типа, признаки двоичного типа описывают связь между типами и признаки преобразования изменяют свойство типа.
Вспомогательный класс integral_constant и его специализации шаблона и false_type формируйте базовые классы true_type для предикатов типов. Предикат типа — это шаблон, принимающий один или несколько аргументов типа. Если предикат типа имеет значение true, он является общедоступным, прямо или косвенно, от true_type. Если предикат типа содержит false, он является общедоступным, прямо или косвенно, от false_type.
Модификатор типа или признак преобразования — это шаблон, принимающий один или несколько аргументов шаблона и имеющий один член ( type ), который является синонимом для измененного типа.
Шаблоны псевдонимов
Чтобы упростить выражения признаков типа, предоставляются шаблоны typename some_trait::type псевдонимов, в которых some_trait имя шаблона класса. Например, add_const имеет шаблон псевдонима для своего типа, add_const_t , определяемого следующим образом.
template using add_const_t = typename add_const::type;
Это указанные псевдонимы для type членов:
add_const_t
add_cv_t
add_lvalue_reference_t
add_pointer_t
add_rvalue_reference_t
add_volatile_t
aligned_storage_t
aligned_union_t \
common_type_t
conditional_t
decay_t
enable_if_t
invoke_result_t
make_signed_t
make_unsigned_t
remove_all_extents_t \
remove_const_t
remove_cv_t
remove_extent_t
remove_pointer_t
remove_reference_t
remove_volatile_t
result_of_t
underlying_type_t \
Классы
Вспомогательный класс и определения типов
Имя | Описание |
---|---|
integral_constant | Создает целочисленную константу из типа и значения. |
true_type | Содержит целочисленную константу со значением true. |
false_type | Содержит целочисленную константу со значением false. |
Категории основных типов
Имя | Описание |
---|---|
is_void | Проверяет, является ли тип типом void . |
is_null_pointer | Проверяет, является ли тип типом std::nullptr_t . |
is_integral | Проверяет, является ли тип целочисленным. |
is_floating_point | Проверяет, является ли тип вещественным (с плавающей запятой). |
is_array | Проверяет, является ли тип массивом. |
is_pointer | Проверяет, является ли тип указателем. |
is_lvalue_reference | Проверяет, является ли тип ссылкой lvalue. |
is_rvalue_reference | Проверяет, является ли тип ссылкой rvalue. |
is_member_object_pointer | Проверяет, является ли тип указателем на объект-член. |
is_member_function_pointer | Проверяет, является ли тип указателем на функцию-член. |
is_enum | Проверяет, является ли тип перечислением. |
is_union | Проверяет, является ли тип объединением. |
is_class | Проверяет, является ли тип классом. |
is_function | Проверяет, является ли тип типом функции. |
Категории составных типов
Имя | Описание |
---|---|
is_reference | Проверяет, является ли тип ссылкой. |
is_arithmetic | Проверяет, является ли тип арифметическим. |
is_fundamental | Проверяет, является ли тип void или арифметическим типом. |
is_object | Проверяет, является ли тип типом объекта. |
is_scalar | Проверяет, является ли тип скалярным. |
is_compound | Проверяет, является ли тип нескалярным. |
is_member_pointer | Проверяет, является ли тип указателем на член. |
Имя | Описание |
---|---|
is_const | Проверяет, является ли тип типом const . |
is_volatile | Проверяет, является ли тип типом volatile . |
is_trivial | Проверяет, является ли тип простейшим. |
is_trivially_copyable | Проверяет, является ли тип тривиально копируемым. |
is_standard_layout | Проверяет, является ли тип стандартным макетом. |
is_pod | Проверяет, является ли тип типом POD. |
is_literal_type | Проверяет, может ли тип быть переменной constexpr или использоваться в функции constexpr . |
is_empty | Проверяет, является ли тип пустым классом. |
is_polymorphic | Проверяет, является ли тип полиморфным классом. |
is_abstract | Проверяет, является ли тип абстрактным классом. |
is_final | Проверяет, является ли тип типом класса, отмеченным final . |
is_aggregate | |
is_signed | Проверяет, является ли тип знаковым целочисленным типом. |
is_unsigned | Проверяет, является ли тип беззнаковым целочисленным типом. |
is_constructible | Проверяет, можно ли сконструировать тип с использованием заданных типов аргументов. |
is_default_constructible | Проверяет, имеет ли тип конструктор по умолчанию. |
is_copy_constructible | Проверяет, имеет ли тип конструктор копирования. |
is_move_constructible | Проверяет, имеет ли тип конструктор перемещения. |
is_assignable | Проверяет, можно ли первому типу назначить значение второго типа. |
is_copy_assignable | Проверяет, можно ли типу назначить значение ссылки константы типа. |
is_move_assignable | Проверяет, можно ли типу назначить ссылку rvalue типа. |
is_swappable | |
is_swappable_with | |
is_destructible | Проверяет, можно ли уничтожить тип. |
is_trivially_constructible | Проверяет, использует ли тип нетривиальные операции, если создан с использованием заданных типов. |
is_trivially_default_constructible | Проверяет, использует ли тип нетривиальные операции, если создан конструктором по умолчанию. |
is_trivially_copy_constructible | Проверяет, использует ли тип нетривиальные операции, если создан конструктором копирования. |
is_trivially_move_constructible | Проверяет, использует ли тип нетривиальные операции, если создан конструктором перемещения. |
is_trivially_assignable | Проверяет, можно ли типам присвоить значение и использует ли назначение нетривиальные операции. |
is_trivially_copy_assignable | Проверяет, можно ли типам присвоить значение копирования и использует ли назначение нетривиальные операции. |
is_trivially_move_assignable | Проверяет, можно ли типам присвоить значение перемещения и использует ли назначение нетривиальные операции. |
is_trivially_destructible | Проверяет, является ли тип разрушаемым и использует ли деструктор нетривиальные операции. |
is_nothrow_constructible | Проверяет, является ли тип конструируемым и известно ли, что он не выдает исключение, если создан с использованием заданных типов. |
is_nothrow_default_constructible | Проверяет, является ли тип конструируемым по умолчанию и известно ли, что он не выдает исключение, если создан конструктором по умолчанию. |
is_nothrow_copy_constructible | Проверяет, можно ли создать тип с помощью конструктора копирования и известно ли, что конструктор копирования не создаст исключения. |
is_nothrow_move_constructible | Проверяет, можно ли создать тип с помощью конструктора перемещения и известно ли, что конструктор перемещения не создаст исключения. |
is_nothrow_assignable | Проверяет, является ли тип назначаемым с использованием определенного типа и известно ли, что назначение не создаст исключения. |
is_nothrow_copy_assignable | Проверяет, является ли тип назначаемым с использованием типа копирования и известно ли, что назначение не создаст исключения. |
is_nothrow_move_assignable | Проверяет, является ли тип назначаемым с использованием типа перемещения и известно ли, что назначение не создаст исключения. |
is_nothrow_swappable | |
is_nothrow_swappable_with | |
is_nothrow_destructible | Проверяет, является ли тип уничтожаемым и известно ли, что деструктор не создаст исключения. |
has_virtual_destructor | Проверяет, есть ли у типа виртуальный деструктор. |
has_unique_object_representations | |
is_invocable | Проверяет, можно ли вызывать вызываемый тип с помощью указанных типов аргументов. Добавлено в C++17. |
is_invocable_r | Проверяет, можно ли вызывать вызываемый тип с помощью указанных типов аргументов, и результат преобразуется в указанный тип. Добавлено в C++17. |
is_nothrow_invocable | Проверяет, может ли вызываемый тип вызываться с помощью указанных типов аргументов и не вызывает исключений. Добавлено в C++17. |
is_nothrow_invocable_r | Проверяет, может ли вызываемый тип вызываться с помощью указанных типов аргументов и не вызывает исключений, а результат преобразуется в указанный тип. Добавлено в C++17. |
Запросы свойств типов
Имя | Описание |
---|---|
alignment_of | Получает выравнивание типа. |
rank | Получает количество измерений массива. |
extent | Получает количество элементов в заданном измерении массива. |
Имя | Описание |
---|---|
is_same | Определяет, совпадают ли два типа. |
is_base_of | Проверяет, является ли один тип базовым для другого. |
is_convertible | Проверяет, можно ли преобразовать один тип в другой. |
Изменения const или volatile
Имя | Описание |
---|---|
add_const | Создает тип const из типа. |
add_volatile | Создает тип volatile из типа. |
add_cv | Создает тип const volatile из типа. |
remove_const | Создает отличный от const тип из типа. |
remove_volatile | Создает отличный от volatile тип из типа. |
remove_cv | Создает отличный от const и volatile тип из типа. |
Имя | Описание |
---|---|
add_lvalue_reference | Создает ссылку на тип из типа. |
add_rvalue_reference | Создает ссылку rvalue на тип из типа |
remove_reference | Делает нессылочный тип из типа. |
Имя | Описание |
---|---|
make_signed | Создает тип, если знак присутствует, или наименьший знаковый тип, размер которого не меньше размера типа. |
make_unsigned | Создает тип, если знак отсутствует, или наименьший беззнаковый тип, размер которого не меньше размера типа. |
Имя | Описание |
---|---|
remove_all_extents | Создает отличный от массива тип из типа массива. |
remove_extent | Создает тип элемента из типа массива. |
Имя | Описание |
---|---|
add_pointer | Создает указатель на тип из типа. |
remove_pointer | Создает тип из указателя на тип. |
Имя | Описание |
---|---|
aligned_storage | Выделяет неинициализированную память для выровненного типа. |
aligned_union | Выделяет неинициализированную память для выровненного объединения с нетривиальным конструктором или деструктором. |
common_type | Создает общий тип для всех типов параметров пакета. |
conditional | Если условие имеет значение true, создает первый заданный тип; в противном случае — второй заданный тип. |
decay | Создает тип в качестве передаваемого значения. Создает нессылочный, неконстантный или долговременный тип либо указатель на тип. |
enable_if | Если условие имеет значение true, создает заданный тип; в противном случае — не создает тип. |
invoke_result | Определяет возвращаемый тип вызываемого типа, который принимает заданные типы аргументов. Добавлено в C++17. |
result_of | Определяет возвращаемый тип вызываемого типа, который принимает заданные типы аргументов. Добавлено в C++14, устарело в C++17. |
underlying_type | Создает базовый целочисленный тип для типа перечисления. |
Признаки логических операторов
Имя | Описание |
---|---|
Сочетании | |
дисъюнкция | |
Отрицание |
См. также
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе https://aka.ms/ContentUserFeedback.
Отправить и просмотреть отзыв по
C++ Проверка условий в шаблонах и зачем нужно *= при использовании type traits
Чем отличаются все эти 3 записи?(надеюсь я в них не ошибся) И второй вопрос: как лучше всего делать проверки на различные условия(для типов) в шаблонах?
Отслеживать
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака
задан 1 окт 2022 в 2:00
Supreme Machine Supreme Machine
163 8 8 бронзовых знаков
Нынче лучше делать проверки с использованием концептов.
1 окт 2022 в 4:52
* = — это два отдельных символа. * — указатель, = — стоит перед аргументом по умолчанию.
1 окт 2022 в 7:52
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Есть два популярных способа:
- typename = std::enable_if_t
- std::enable_if_t = nullptr
Второй способ лучше, по двум причинам:
- Нельзя отключить проверку, передав какой-то свой тип в этот шаблонный аргумент.
- Можно сделать несколько функций, которые будут отличаться только условием. Если сделать это с первым способом, то компилятор будет ругаться на переопределение функции.
У второго способа есть разные вариации: std::enable_if_t <. int>= 0 , std::enable_if_t * = nullptr (что эквивалентно std::enable_if_t <. void *>= nullptr ), и т. п. Но они плохи тем, что позволяют сгенерировать несколько разных копий шаблона, передав туда разные шаблонные аргументы. А у std::nullptr_t возможное значение только одно, поэтому с ним так не сделать. (В С++20 для этих целей также подходит какой-нибудь пустой класс.)
Отслеживать
ответ дан 1 окт 2022 в 5:23
HolyBlackCat HolyBlackCat
27.9k 3 3 золотых знака 27 27 серебряных знаков 40 40 бронзовых знаков
В С++20 можно привести к типу std::nullptr_t какой-нибудь пустой класс?
3 окт 2022 в 7:30
@maestro Нет, в смысле std::enable_if_t <. MyClass>= MyClass<> .
3 окт 2022 в 7:33
- c++
- шаблоны-с++
- метапрограммирование
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.26.8280
Type traits c что это
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
‘> Что такое traits? , Свойства и их использование
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
Сообщ. #1 , 11.03.05, 19:27
Рейтинг (т): 172
Что такое traits?
Вступление
В данной статье я попытаюсь рассказать, что такое traits. Будут рассмотрены некоторые примеры применения traits, которые будут заключаться как в использовании traits в нашем коде, так и в возможных способах расширения стандартной библиотеки C++, которая тоже использует traits. Также будут рассмотрены возможные проблемы, которые могут возникнуть при расширении стандартной библиотеки C++.
Для кого написана данная статья?
Эта статья написана для программистов на C++, которые уже неплохо владеют самим языком, его основными конструкциями. В частности, необходимо знание, что такое шаблоны(templates) и желателен опыт их использования. Также очень желательно знание стандартной библиотеки C++, так как многие примеры будут посвящены именно ей.
Ну, поехали.
Итак, приступим. Думаю, начать стоит с перевода термина traits. Обычно его переводят как «свойства». Но traits реализуются классом, поэтому обычно употребляется термин «класс свойств». Следует заметить, что свойства также можно реализовать с помощью структуры, так как в C++ это практически аналоги. Далее я буду использовать термин класс, хотя все сказанное будет в той же мере относиться к структурам.
Теперь следует дать определение свойств. Натан Майерс, разработавший метод использования свойств, предложил такое определение:
Класс свойств — это класс, используемый вместо параметров шаблона. В качестве класса он объединяет полезные типы и константы; как шаблон, он является средством для обеспечения того «дополнительного уровня косвенности», который решает все проблемы программного обеспечения.
Определение не настолько понятное, так что давайте попробуем разобраться, что же имеется в виду. Для этого предлагается рассмотреть небольшой пример. В качестве примера мы рассмотрим шаблонный класс динамического массива. Конечно, реализовывать полностью этот класс мы не будем(у нас уже есть vector), но общие концепции мы рассмотрим.
Итак, наш шаблонный класс динамического массива должен иметь в качестве аргументов шаблона:
1) тип элемента шаблона
2) тип ссылки на элемент
3) тип аргумента функций
4) тип константной ссылки
Думаю, прокомментировать стоит только тип аргумента функций. Этот тип используется для вставки элементов в массив. Например, эффективней передать int или char по значению, чем по константной ссылке.
Тогда набросок класса будет выглядеть так: