Библиотека метапрограммирования
C++ предоставляет средства метапрограммирования, такие как признаки типов, рациональная арифметика времени компиляции и целочисленные последовательности времени компиляции.
Содержание |
[править] Свойства типа
Эти черты типа определяют шаблонные интерфейсы времени компиляции для запроса свойств типов.
Попытки специализировать шаблоны определённые в <type_traits> заголовке и описанные в этой секции приводят к неопределённому поведению.
Шаблоны определённые в заголовке <type_traits> могут быть инстанциированы в неполных типах если не указано иное, несмотря на общий запрет на создание экземпляров шаблонов стандартной библиотеки с неполными типами.
| Определены в заголовочном файле
<type_traits> | |
Primary type categories | |
| (C++11) |
проверяет, является ли тип void (шаблон класса) |
| (C++14) |
проверяет, является ли тип std::nullptr_t (шаблон класса) |
| (C++11) |
проверяет, является ли тип целочисленным типом (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом с плавающей запятой (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом массива (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом перечисления (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом объединения (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом класса не объединения (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом функции (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом указателя (шаблон класса) |
| (C++11) |
проверяет, является ли тип левосторонней ссылкой (шаблон класса) |
| (C++11) |
проверяет, является ли тип правосторонней ссылкой (шаблон класса) |
| (C++11) |
проверяет, является ли тип указателем на нестатический объект-элемент (шаблон класса) |
| (C++11) |
проверяет, является ли тип указателем на нестатическую функцию-элемент (шаблон класса) |
Composite type categories | |
| (C++11) |
проверяет, является ли тип фундаментальным типом (шаблон класса) |
| (C++11) |
проверяет, является ли тип арифметическим (шаблон класса) |
| (C++11) |
проверяет, является ли тип целочисленным (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом объекта (шаблон класса) |
| (C++11) |
проверяет, является ли тип составным типом (шаблон класса) |
| (C++11) |
проверяет, является ли тип либо левосторонней ссылкой, либо правосторонней ссылкой (шаблон класса) |
| (C++11) |
проверяет, является ли тип указателем на нестатическую функцию-элемент или объект-элемент (шаблон класса) |
Type properties | |
| (C++11) |
проверяет, является ли тип квалифицированным как const (шаблон класса) |
| (C++11) |
проверяет, является ли тип volatile квалифицированным (шаблон класса) |
| (C++11) |
проверяет, является ли тип тривиальным (шаблон класса) |
| (C++11) |
проверяет, можно ли тривиально скопировать тип (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом со стандартной компоновкой (шаблон класса) |
| (C++11)(устарело в C++20) |
проверяет, является ли тип типом простых старых данных (POD) (шаблон класса) |
| (C++11) (устарело в C++17) (убрано в C++20) |
проверяет, является ли тип литеральным (шаблон класса) |
| проверяет, влияет ли каждый бит в представлении объекта типа на его значение (шаблон класса) | |
| (C++11) |
проверяет, является ли тип типом класса (но не объединения) и не имеет ли нестатические элементы данных (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом полиморфного класса (шаблон класса) |
| (C++11) |
проверяет, является ли тип типом абстрактного класса (шаблон класса) |
| (C++14) |
проверяет, является ли тип окончательным типом класса (шаблон класса) |
| (C++17) |
проверяет, является ли тип агрегатным типом (шаблон класса) |
| (C++11) |
проверяет, является ли тип арифметическим типом со знаком (шаблон класса) |
| (C++11) |
проверяет, является ли тип беззнаковым арифметическим типом (шаблон класса) |
| (C++20) |
проверяет, является ли тип типом массива с известной границей (шаблон класса) |
| (C++20) |
проверяет, является ли тип типом массива с неизвестной границей (шаблон класса) |
| (C++23) |
проверяет, является ли тип типом перечисления с ограниченной областью видимости (шаблон класса) |
Supported operations | |
| (C++11) (C++11) (C++11) |
проверяет, есть ли у типа конструктор для определённых аргументов (шаблон класса) |
| проверяет, есть ли у типа конструктор по умолчанию (шаблон класса) | |
| (C++11) (C++11) (C++11) |
проверяет, есть ли у типа конструктор копирования (шаблон класса) |
| (C++11) (C++11) (C++11) |
проверяет, может ли тип быть сконструирован из правосторонней ссылки (шаблон класса) |
| (C++11) (C++11) (C++11) |
проверяет, есть ли у типа оператор присваивания для определённого аргумента (шаблон класса) |
| (C++11) (C++11) (C++11) |
проверяет, есть ли у типа оператор присваивания копированием (шаблон класса) |
| (C++11) (C++11) (C++11) |
проверяет, есть ли у типа оператор присваивания перемещением (шаблон класса) |
| (C++11) (C++11) (C++11) |
проверяет, есть ли у типа не удалённый деструктор (шаблон класса) |
| (C++11) |
проверяет, есть ли у типа виртуальный деструктор (шаблон класса) |
| (C++17) (C++17) (C++17) (C++17) |
проверяет, можно ли поменять местами объекты одного типа на объекты того же или другого типа (шаблон класса) |
Property queries | |
| (C++11) |
получает требования к выравниванию типа (шаблон класса) |
| (C++11) |
получает количество измерений типа, являющимся массивом (шаблон класса) |
| (C++11) |
получает размер типа массива по указанному измерению (шаблон класса) |
Type relationships | |
| (C++11) |
проверяет, являются ли два типа одним и тем же типом (шаблон класса) |
| (C++11) |
проверяет, является ли тип производным от другого типа (шаблон класса) |
| (C++11) (C++20) |
проверяет, можно ли преобразовать тип в другой тип (шаблон класса) |
| проверяет, может ли тип быть вызван (как если бы std::invoke) с заданными типами аргументов (шаблон класса) | |
| (C++20) |
проверяет, являются ли два типа совместимыми с компоновкой (шаблон класса) |
| проверяет, является ли тип взаимопреобразуемым по указателю (начальной) базой другого типа (шаблон класса) | |
| проверяет, являются ли объекты типа взаимопреобразуемыми по указателю с указанным подобъектом этого типа (шаблон функции) | |
| (C++20) |
проверяет, соответствуют ли два указанных элемента друг другу в общей начальной подпоследовательности двух указанных типов (шаблон функции) |
[править] Операции над чертами
| Определены в заголовочном файле
<type_traits> | |
| (C++17) |
вариативная логическая метафункция И (шаблон класса) |
| (C++17) |
вариативная логическая метафункция ИЛИ (шаблон класса) |
| (C++17) |
логическая метафункция НЕ (шаблон класса) |
[править] Базовые классы
| Определены в заголовочном файле
<type_traits> | |
| (C++11) (C++17) |
константа времени компиляции указанного типа с указанным значением (шаблон класса) |
Две специализации std::integral_constant обеспечиваются для типа bool:
| Определены в заголовочном файле
<type_traits> | |
Specializations | |
| Type | Definition |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
[править] Модификации типов
Эти черты типа применяют модификации шаблонных параметров и объявляют(иногда в зависимости от условий) type member typedef как результирующий тип.
Попытки специализировать шаблон, определенный в заголовке <type_traits> и описанный в данной статье вызовет неопределенное поведение, за исключением std::common_type and std::basic_common_reference (начиная с C++20) могут быть специализированы как требуется в описании.
Шаблон, определенный в заголовке <type_traits> могут быть инстанциированы с неполным типом, если не указано иное, may be instantiated with an incomplete type unless otherwise specified, несмотря на общий запрет на создание экземпляров шаблонов стандартной библиотеки с неполными типами.
| Определены в заголовочном файле
<type_traits> | |
Const-volatility specifiers | |
| (C++11) (C++11) (C++11) |
удаляет спецификаторы const и/или volatile из данного типа (шаблон класса) |
| (C++11) (C++11) (C++11) |
добавляет спецификаторы const и/или volatile к данному типу (шаблон класса) |
References | |
| (C++11) |
удаляет ссылку из данного типа (шаблон класса) |
| (C++11) (C++11) |
добавляет левостороннюю или правостороннюю ссылку на данный тип (шаблон класса) |
Pointers | |
| (C++11) |
удаляет указатель из данного типа (шаблон класса) |
| (C++11) |
добавляет указатель на данный тип (шаблон класса) |
Sign modifiers | |
| (C++11) |
делает данный целочисленный тип знаковым (шаблон класса) |
| (C++11) |
делает данный целочисленный тип беззнаковым (шаблон класса) |
Arrays | |
| (C++11) |
удаляет одну размерность из данного типа массива (шаблон класса) |
| (C++11) |
удаляет все измерения из данного типа массива (шаблон класса) |
[править] Разные преобразования
| Определены в заголовочном файле
<type_traits> | |
| (C++11)(устарело в C++23) |
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера (шаблон класса) |
| (C++11)(устарело в C++23) |
определяет тип, подходящий для использования в качестве неинициализированного хранилища для всех данных типов (шаблон класса) |
| (C++11) |
применяет преобразования типов, как при передаче аргумента функции по значению (шаблон класса) |
| (C++20) |
объединяет std::remove_cv и std::remove_reference (шаблон класса) |
| (C++11) |
условно удаляет перегрузку функции или специализацию шаблона из разрешения перегрузки (шаблон класса) |
| (C++11) |
выбирает тот или иной тип на основе логического значения времени компиляции (шаблон класса) |
| (C++11) |
определяет общий тип группы типов (шаблон класса) |
| определяет общий ссылочный тип группы типов (шаблон класса) | |
| (C++11) |
получает базовый целочисленный тип для данного типа перечисления (шаблон класса) |
| (C++11)(убрано в C++20) (C++17) |
выводит тип результата вызова вызываемого объекта с набором аргументов (шаблон класса) |
| (C++17) |
псевдоним шаблона с переменным числом аргументов типа void (псевдоним шаблона) |
| (C++20) |
возвращает аргумент типа без изменений (шаблон класса) |
[править] Compile-time rational arithmetic
Заголовок <ratio> обеспечивает типы и функции для управления и хранения соотношений времени компиляции.
[править] Целочисленные последовательности времени компиляции
| Определены в заголовочном файле
<utility> | |
| (C++14) |
реализует последовательность целых чисел на этапе компиляции (шаблон класса) |

