Spec-Zone.ru › C++

Библиотека метапрограммирования (с C++11)

C++ предоставляет средства метапрограммирования, такие как характеристики типов, рациональная арифметика во время компиляции и целочисленные последовательности во время компиляции.

Характеристики типов

Характеристики типов определяют интерфейсы на основе шаблонов во время компиляции для запроса свойств типов.

Попытка специализации шаблона, определённого в заголовке <type_traits> и перечисленного на этой странице, приводит к неопределённому поведению, за исключением случаев, когда std::common_type и std::basic_common_reference(с C++20) могут быть специализированы, как требуется в описании.

Шаблон, определённый в заголовке <type_traits>, может быть инстанцирован с неполным типом, если не указано иное, несмотря на общее запрещение инстанцирования шаблонов стандартной библиотеки с неполными типами.

Базовые классы

Большинство характеристик типов, не являющихся преобразованиями, должны быть открыто и однозначно унаследованы от std::integeral_constant для удовлетворения требований UnaryTypeTrait или BinaryTypeTrait.

Определено в заголовке <type_traits>
integral_constantbool_constant
(C++11)(C++17)
константа во время компиляции заданного типа с заданным значением
(шаблон класса)

Предоставлены две специализации std::integral_constant для типа bool:

Определено в заголовке <type_traits>
Тип Определение
true_type std::integral_constant<bool, true>
false_type std::integral_constant<bool, false>

Унарные характеристики типов

Унарные характеристики типов могут использоваться для запроса логических свойств типа во время компиляции.

Все эти характеристики типов удовлетворяют UnaryTypeTrait, основная характеристика каждого типа-характеристики — либо std::true_type , либо std::false_type, в зависимости от выполнения соответствующего условия.

Основные категории типов
Определено в заголовке <type_traits>
is_void
(C++11)
проверяет, является ли тип void
(шаблон класса)
is_null_pointer
(C++14)
проверяет, является ли тип указателем на std::nullptr_t
(шаблон класса)
is_integral
(C++11)
проверяет, является ли тип целочисленным типом
(шаблон класса)
is_floating_point
(C++11)
проверяет, является ли тип типом с плавающей точкой
(шаблон класса)
is_array
(C++11)
проверяет, является ли тип массивом
(шаблон класса)
is_enum
(C++11)
проверяет, является ли тип перечислением
(шаблон класса)
is_union
(C++11)
проверяет, является ли тип объединением
(шаблон класса)
is_class
(C++11)
проверяет, является ли тип классом, отличным от объединения
(шаблон класса)
is_function
(C++11)
проверяет, является ли тип функцией
(шаблон класса)
is_pointer
(C++11)
проверяет, является ли тип указателем
(шаблон класса)
is_lvalue_reference
(C++11)
проверяет, является ли тип ссылкой на lvalue
(шаблон класса)
is_rvalue_reference
(C++11)
проверяет, является ли тип ссылкой на rvalue
(шаблон класса)
is_member_object_pointer
(C++11)
проверяет, является ли тип указателем на нестатический член объекта
(шаблон класса)
is_member_function_pointer
(C++11)
проверяет, является ли тип указателем на нестатический член функции
(шаблон класса)
Составные категории типов
Определено в заголовке <type_traits>
is_fundamental
(C++11)
проверяет, является ли тип фундаментальным типом
(шаблон класса)
is_arithmetic
(C++11)
проверяет, является ли тип арифметическим типом
(шаблон класса)
is_scalar
(C++11)
проверяет, является ли тип скалярным типом
(шаблон класса)
is_object
(C++11)
проверяет, является ли тип объектом
(шаблон класса)
is_compound
(C++11)
проверяет, является ли тип составным типом
(шаблон класса)
is_reference
(C++11)
проверяет, является ли тип ссылкой (lvalue или rvalue)
(шаблон класса)
is_member_pointer
(C++11)
проверяет, является ли тип указателем на нестатический член функции или объекта
(шаблон класса)
Свойства типов
Определено в заголовке <type_traits>
is_const
(C++11)
проверяет, имеет ли тип квалификатор const
(шаблон класса)
is_volatile
(C++11)
проверяет, имеет ли тип квалификатор volatile
(шаблон класса)
is_trivial
(C++11)
проверяет, является ли тип тривиальным
(шаблон класса)
is_trivially_copyable
(C++11)
проверяет, может ли тип быть тривиально скопирован
(шаблон класса)
is_standard_layout
(C++11)
проверяет, является ли тип типом с стандартной компоновкой
(шаблон класса)
is_pod
(C++11)(устарело в C++20)
проверяет, является ли тип типом простого данных (POD)
(шаблон класса)
is_literal_type
(C++11)(устарело в C++17)(удалено в C++20)
проверяет, является ли тип литеральным типом
(шаблон класса)
has_unique_object_representations
(C++17)
проверяет, вносит ли каждый бит в представлении объекта типа вклад в его значение
(шаблон класса)
is_empty
(C++11)
проверяет, является ли тип классом (но не объединением) и не имеет ли нестатических данных-членов
(шаблон класса)
is_polymorphic
(C++11)
проверяет, является ли тип полиморфным типом класса
(шаблон класса)
is_abstract
(C++11)
проверяет, является ли тип типом абстрактного класса
(шаблон класса)
is_final
(C++14)
проверяет, является ли тип типом конечного класса
(шаблон класса)
is_aggregate
(C++17)
проверяет, является ли тип агрегатным типом
(шаблон класса)
is_implicit_lifetime
(C++23)
проверяет, является ли тип типом с неявным временем жизни
(шаблон класса)
is_signed
(C++11)
проверяет, является ли тип знаковым арифметическим типом
(шаблон класса)
is_unsigned
(C++11)
проверяет, является ли тип беззнаковым арифметическим типом
(шаблон класса)
is_bounded_array
(C++20)
проверяет, является ли тип массивом с известной границей
(шаблон класса)
is_unbounded_array
(C++20)
проверяет, является ли тип массивом с неизвестной границей
(шаблон класса)
is_scoped_enum
(C++23)
проверяет, является ли тип перечислением с областью действия
(шаблон класса)
Операции, поддерживаемые типами
Определены в заголовке <type_traits>
is_constructibleis_trivially_constructibleis_nothrow_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор для заданных аргументов
(шаблон класса)
is_default_constructibleis_trivially_default_constructibleis_nothrow_default_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор по умолчанию
(шаблон класса)
is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа копирующий конструктор
(шаблон класса)
is_move_constructibleis_trivially_move_constructibleis_nothrow_move_constructible
(C++11)(C++11)(C++11)
проверяет, может ли тип быть построен из ссылки на временное значение
(шаблон класса)
is_assignableis_trivially_assignableis_nothrow_assignable
(C++11)(C++11)(C++11)
проверяет, есть ли у типа оператор присваивания для определенного аргумента
(шаблон класса)
is_copy_assignableis_trivially_copy_assignableis_nothrow_copy_assignable
(C++11)(C++11)(C++11)
проверяет, есть ли у типа оператор копирующего присваивания
(шаблон класса)
is_move_assignableis_trivially_move_assignableis_nothrow_move_assignable
(C++11)(C++11)(C++11)
проверяет, есть ли у типа оператор перемещающего присваивания
(шаблон класса)
is_destructibleis_trivially_destructibleis_nothrow_destructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа не удалённый деструктор
(шаблон класса)
has_virtual_destructor
(C++11)
проверяет, есть ли у типа виртуальный деструктор
(шаблон класса)
is_swappable_withis_swappableis_nothrow_swappable_withis_nothrow_swappable
(C++17)(C++17)(C++17)(C++17)
проверяет, могут ли объекты одного или разных типов быть поменены местами
(шаблон класса)
reference_constructs_from_temporary
(C++23)
проверяет, связана ли ссылка с временным объектом при прямой инициализации
(шаблон класса)
reference_converts_from_temporary
(C++23)
проверяет, связана ли ссылка с временным объектом при копировании инициализации
(шаблон класса)

Запросы свойств

Свойства типов могут быть запрошены в compile time.

Все эти типы соответствуют UnaryTypeTrait, базовый тип каждого - std::integral_constant<size_t, Value>, где Value является результатом запроса соответствующего свойства.

Определены в заголовке <type_traits>
alignment_of
(C++11)
получает требования выравнивания типа
(шаблон класса)
rank
(C++11)
получает количество измерений типа массива
(шаблон класса)
extent
(C++11)
получает размер типа массива по указанному измерению
(шаблон класса)

Взаимосвязи типов

Типовые взаимосвязи могут быть запрошены во время компиляции.

Все эти типы соответствуют BinaryTypeTrait, базовый тип каждого - либо std::true_type, либо std::false_type, в зависимости от выполнения условия.

Определено в header <type_traits>
is_same
(C++11)
проверяет, являются ли два типа одинаковыми
(шаблон класса)
is_base_of
(C++11)
проверяет, является ли тип производным от другого типа
(шаблон класса)
is_convertibleis_nothrow_convertible
(C++11)(C++20)
проверяет, можно ли преобразовать один тип в другой
(шаблон класса)
is_layout_compatible
(C++20)
проверяет, являются ли два типа совместимыми по расположению
(шаблон класса)
is_pointer_interconvertible_base_of
(C++20)
проверяет, является ли тип указатель-совместимым (начальным) базовым типом другого типа
(шаблон класса)
is_invocableis_invocable_ris_nothrow_invocableis_nothrow_invocable_r
(C++17)
проверяет, можно ли вызвать тип (как если бы с помощью std::invoke) с заданными типами аргументов
(шаблон класса)

Преобразования типов

Свойства преобразования типов преобразуют один тип в другой в соответствии с определенными правилами.

Все эти свойства типов удовлетворяют TransformationTrait.

Спецификаторы const-volatile
Определено в заголовке <type_traits>
remove_cvremove_constremove_volatile
(C++11)(C++11)(C++11)
удаляет спецификаторы const и/или volatile из заданного типа
(шаблон класса)
add_cvadd_constadd_volatile
(C++11)(C++11)(C++11)
добавляет спецификаторы const и/или volatile к заданному типу
(шаблон класса)
Ссылки
Определено в заголовке <type_traits>
remove_reference
(C++11)
удаляет ссылку из заданного типа
(шаблон класса)
add_lvalue_referenceadd_rvalue_reference
(C++11)(C++11)
добавляет ссылку lvalue или rvalue к заданному типу
(шаблон класса)
Модификаторы знака
Определено в заголовке <type_traits>
make_signed
(C++11)
делает заданный целочисленный тип знаковым
(шаблон класса)
make_unsigned
(C++11)
делает заданный целочисленный тип беззнаковым
(шаблон класса)
Массивы
Определено в заголовке <type_traits>
remove_extent
(C++11)
удаляет одну размерность из заданного типа массива
(шаблон класса)
remove_all_extents
(C++11)
удаляет все размерности из заданного типа массива
(шаблон класса)
Указатели
Определено в заголовке <type_traits>
remove_pointer
(C++11)
удаляет указатель из заданного типа
(шаблон класса)
add_pointer
(C++11)
добавляет указатель к заданному типу
(шаблон класса)
Другие преобразования
Определено в заголовке <type_traits>
aligned_storage
(C++11)(устарело в C++23)
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера
(шаблон класса)
aligned_union
(C++11)(устарело в C++23)
определяет тип, подходящий для использования в качестве неинициализированного хранилища для всех указанных типов
(шаблон класса)
decay
(C++11)
применяет преобразования типов, как при передаче аргумента функции по значению
(шаблон класса)
remove_cvref
(C++20)
объединяет std::remove_cv и std::remove_reference
(шаблон класса)
enable_if
(C++11)
условно удаляет перегрузку функции или специализацию шаблона из разрешения перегрузки
(шаблон класса)
conditional
(C++11)
выбирает один тип или другой, основываясь на булевом значении во время компиляции
(шаблон класса)
common_type
(C++11)
определяет общий тип группы типов
(шаблон класса)
common_referencebasic_common_reference
(C++20)
определяет общий тип ссылки группы типов
(шаблон класса)
underlying_type
(C++11)
получает базовый целочисленный тип для заданного типа перечисления
(шаблон класса)
result_ofinvoke_result
(C++11)(удалено в C++20)(C++17)
вычисляет тип результата вызова вызываемого объекта с набором аргументов
(шаблон класса)
void_t
(C++17)
шаблон алиасов void с переменным числом параметров
(шаблон алиаса)
type_identity
(C++20)
возвращает аргумент типа без изменений
(шаблон класса)

Логические операции

Логические операторы применимы к другим типам свойств.

Определено в заголовке <type_traits>
conjunction
(C++17)
многоаргументная логическая метафункция И
(шаблон класса)
disjunction
(C++17)
многоаргументная логическая метафункция ИЛИ
(шаблон класса)
negation
(C++17)
логическая метафункция НЕ
(шаблон класса)

Связи между членами

Определено в заголовке <type_traits>
is_pointer_interconvertible_with_class
(C++20)
проверяет, можно ли указать указатели на объекты типа с заданным подобъектом этого типа
(шаблон функции)
is_corresponding_member
(C++20)
проверяет, соответствуют ли два указанных члена друг другу в общем начальном подпоследовательности двух указанных типов
(шаблон функции)

Вычисления рациональных чисел во время компиляции

Заголовок <ratio> предоставляет типы и функции для работы с рациональными числами во время компиляции.

Последовательности целых чисел во время компиляции

Определено в заголовке <utility>
integer_sequence
(C++14)
реализует последовательность целых чисел во время компиляции
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/meta

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API