Библиотека метапрограммирования
C++ предоставляет средства метапрограммирования, такие как свойства типов, рациональная арифметика времени компиляции и целочисленные последовательности времени компиляции.
Содержание |
[править] Свойства типов
Свойства типов определяют шаблонные интерфейсы времени компиляции для запроса свойств типов.
Попытка специализировать шаблон, определённый в заголовке <type_traits> и указанный на этой странице, приводит к неопределённому поведению, за исключением того, что std::common_type и std::basic_common_reference (начиная с C++20) могут быть специализированы, как требуется в описании.
Шаблон, определённый в заголовке <type_traits>, может быть инстанциирован с неполным типом, если не указано иное, несмотря на общий запрет на создание экземпляров шаблонов стандартной библиотеки с неполными типами.
[править] Базовые классы
Большинство свойств непреобразованного типа должны быть открыто и однозначно получены из std::integeral_constant, чтобы соответствовать требованиям UnaryTypeTrait или BinaryTypeTrait.
Определены в заголовочном файле
<type_traits> | |
(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> | |
(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) |
проверяет, является ли тип указателем на нестатическую функцию-элемент (шаблон класса) |
Категории составных типов | |
Определены в заголовочном файле
<type_traits> | |
(C++11) |
проверяет, является ли тип фундаментальным типом (шаблон класса) |
(C++11) |
проверяет, является ли тип арифметическим типом (шаблон класса) |
(C++11) |
проверяет, является ли тип целочисленным типом (шаблон класса) |
(C++11) |
проверяет, является ли тип объектным типом (шаблон класса) |
(C++11) |
проверяет, является ли тип составным типом (шаблон класса) |
(C++11) |
проверяет, является ли тип либо левосторонней ссылкой, либо правосторонней ссылкой (шаблон класса) |
(C++11) |
проверяет, является ли тип указателем на нестатическую функцию-элемент или объект-элемент (шаблон класса) |
Свойства типа | |
Определены в заголовочном файле
<type_traits> | |
(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++23) |
проверяет, является ли тип типом с неявным временем жизни (шаблон класса) |
(C++11) |
проверяет, является ли тип арифметическим типом со знаком (шаблон класса) |
(C++11) |
проверяет, является ли тип беззнаковым арифметическим типом (шаблон класса) |
(C++20) |
проверяет, является ли тип типом массива с известной границей (шаблон класса) |
(C++20) |
проверяет, является ли тип типом массива с неизвестной границей (шаблон класса) |
(C++23) |
проверяет, является ли тип типом перечисления с ограниченной областью видимости (шаблон класса) |
Поддерживаемые операции | |
Определены в заголовочном файле
<type_traits> | |
(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) |
проверяет, можно ли объекты одного типа обменять с объектами того же или другого типа (шаблон класса) |
проверяет, привязана ли ссылка к временному объекту в прямой инициализации (шаблон класса) | |
проверяет, привязана ли ссылка к временному объекту при инициализации копированием (шаблон класса) |
[править] Запросы свойств
Свойста запросов свойств можно использовать для запроса целочисленных свойств типа во время компиляции.
Все эти свойства типа соответствуют UnaryTypeTrait, базовая характеристика каждого свойства типа это std::integral_constant<size_t, Value>, где Value это результат запроса соответствующего свойства.
Определены в заголовочном файле
<type_traits> | |
(C++11) |
получает требования к выравниванию типа (шаблон класса) |
(C++11) |
получает количество измерений типа, являющегося массивом (шаблон класса) |
(C++11) |
получает размер типа массива по указанному измерению (шаблон класса) |
[править] Отношения типа
Свойства отношения типа можно использовать для запроса отношений между типами во время компиляции.
Все эти свойства типа соответствуют BinaryTypeTrait, базовая характеристика каждого свойства типа это либо std::true_type, либо std::false_type, в зависимости от того, выполнено ли соответствующее условие.
Определены в заголовочном файле
<type_traits> | |
(C++11) |
проверяет, являются ли два типа одним и тем же типом (шаблон класса) |
(C++11) |
проверяет, является ли тип производным от другого типа (шаблон класса) |
(C++11)(C++20) |
проверяет, можно ли преобразовать тип в другой тип (шаблон класса) |
(C++20) |
проверяет, являются ли два типа совместимыми по компоновке (шаблон класса) |
проверяет, является ли тип взаимопреобразуемым по указателю (изначально) базовым классом другого типа (шаблон класса) | |
проверяет, может ли тип быть вызван (как если бы std::invoke) с заданными типами аргументов (шаблон класса) |
[править] Преобразования типов
Свойства преобразования типов преобразуют один тип в другой по некоторым предопределённым правилам.
Все эти свойства типа соответствуют TransformationTrait.
Константно-волатильные спецификаторы | |
Определены в заголовочном файле
<type_traits> | |
(C++11)(C++11)(C++11) |
удаляет спецификаторы const и/или volatile из данного типа (шаблон класса) |
(C++11)(C++11)(C++11) |
добавляет спецификаторы const и/или volatile к данному типу (шаблон класса) |
Ссылки | |
Определены в заголовочном файле
<type_traits> | |
(C++11) |
удаляет ссылку из данного типа (шаблон класса) |
(C++11)(C++11) |
добавляет левостороннюю или правостороннюю ссылку к данному типу (шаблон класса) |
Модификаторы знака | |
Определены в заголовочном файле
<type_traits> | |
(C++11) |
делает данный целочисленный тип знаковым (шаблон класса) |
(C++11) |
делает данный целочисленный тип беззнаковым (шаблон класса) |
Массивы | |
Определены в заголовочном файле
<type_traits> | |
(C++11) |
удаляет одну размерность из данного типа массива (шаблон класса) |
(C++11) |
удаляет все измерения из данного типа массива (шаблон класса) |
Указатели | |
Определены в заголовочном файле
<type_traits> | |
(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) |
возвращает аргумент тип без изменений (шаблон класса) |
[править] Логические операции
Свойства логических операторов применяют логические операторы к другим свойствам типа.
Определены в заголовочном файле
<type_traits> | |
(C++17) |
вариативная логическая метафункция И (шаблон класса) |
(C++17) |
вариативная логическая метафункция ИЛИ (шаблон класса) |
(C++17) |
логическая метафункция НЕ (шаблон класса) |
[править] Отношения элементов
Определены в заголовочном файле
<type_traits> | |
проверяет, являются ли объекты типа взаимопреобразуемыми по указателю с указанным подобъектом этого типа (шаблон функции) | |
(C++20) |
проверяет, соответствуют ли два указанных элемента друг другу в общей начальной подпоследовательности двух указанных типов (шаблон функции) |
[править] Рациональная арифметика времени компиляции
Заголовок <ratio> предоставляет типы и функции для управления и хранения соотношений времени компиляции.
[править] Целочисленные последовательности времени компиляции
Определены в заголовочном файле
<utility> | |
(C++14) |
реализует последовательность целых чисел на этапе компиляции (шаблон класса) |