Type traits c что это
Перейти к содержимому

Type traits c что это

  • автор:

Определения типов

Тип является синонимом для специализации шаблона 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

Второй способ лучше, по двум причинам:

  1. Нельзя отключить проверку, передав какой-то свой тип в этот шаблонный аргумент.
  2. Можно сделать несколько функций, которые будут отличаться только условием. Если сделать это с первым способом, то компилятор будет ругаться на переопределение функции.

У второго способа есть разные вариации: 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 по значению, чем по константной ссылке.
Тогда набросок класса будет выглядеть так:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *