Библиотека метапрограммирования (с C++11)
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) | проверяет, является ли тип ссылкой на lvalue (шаблон класса) |
|
(C++11) | проверяет, является ли тип ссылкой на rvalue (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатический член объекта (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатический член функции (шаблон класса) |
Составные категории типов |
|
Определено в заголовке <type_traits> |
|
|
(C++11) | проверяет, является ли тип фундаментальным типом (шаблон класса) |
|
(C++11) | проверяет, является ли тип арифметическим типом (шаблон класса) |
|
(C++11) | проверяет, является ли тип скалярным типом (шаблон класса) |
|
(C++11) | проверяет, является ли тип объектом (шаблон класса) |
|
(C++11) | проверяет, является ли тип составным типом (шаблон класса) |
|
(C++11) | проверяет, является ли тип ссылкой (lvalue или rvalue) (шаблон класса) |
|
(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++17) | проверяет, вносит ли каждый бит в представлении объекта типа вклад в его значение (шаблон класса) |
|
(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++11)(C++11) | проверяет, есть ли у типа не удалённый деструктор (шаблон класса) |
|
(C++11) | проверяет, есть ли у типа виртуальный деструктор (шаблон класса) |
|
(C++17)(C++17)(C++17)(C++17) | проверяет, могут ли объекты одного или разных типов быть поменены местами (шаблон класса) |
|
(C++23) | проверяет, связана ли ссылка с временным объектом при прямой инициализации (шаблон класса) |
|
(C++23) | проверяет, связана ли ссылка с временным объектом при копировании инициализации (шаблон класса) |
Запросы свойств
Свойства типов могут быть запрошены в compile time.
Все эти типы соответствуют UnaryTypeTrait, базовый тип каждого - std::integral_constant<size_t, Value>, где Value является результатом запроса соответствующего свойства.
Определены в заголовке <type_traits> |
|
|---|---|
|
(C++11) | получает требования выравнивания типа (шаблон класса) |
|
(C++11) | получает количество измерений типа массива (шаблон класса) |
|
(C++11) | получает размер типа массива по указанному измерению (шаблон класса) |
Взаимосвязи типов
Типовые взаимосвязи могут быть запрошены во время компиляции.
Все эти типы соответствуют BinaryTypeTrait, базовый тип каждого - либо std::true_type, либо std::false_type, в зависимости от выполнения условия.
Определено в header <type_traits> |
|
|---|---|
|
(C++11) | проверяет, являются ли два типа одинаковыми (шаблон класса) |
|
(C++11) | проверяет, является ли тип производным от другого типа (шаблон класса) |
|
(C++11)(C++20) | проверяет, можно ли преобразовать один тип в другой (шаблон класса) |
|
(C++20) | проверяет, являются ли два типа совместимыми по расположению (шаблон класса) |
|
(C++20) | проверяет, является ли тип указатель-совместимым (начальным) базовым типом другого типа (шаблон класса) |
|
(C++17) | проверяет, можно ли вызвать тип (как если бы с помощью std::invoke) с заданными типами аргументов (шаблон класса) |
Преобразования типов
Свойства преобразования типов преобразуют один тип в другой в соответствии с определенными правилами.
Все эти свойства типов удовлетворяют TransformationTrait.
Спецификаторы const-volatile |
|
Определено в заголовке <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) | добавляет ссылку lvalue или rvalue к заданному типу (шаблон класса) |
Модификаторы знака |
|
Определено в заголовке <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++20) | определяет общий тип ссылки группы типов (шаблон класса) |
|
(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) | проверяет, можно ли указать указатели на объекты типа с заданным подобъектом этого типа (шаблон функции) |
|
(C++20) | проверяет, соответствуют ли два указанных члена друг другу в общем начальном подпоследовательности двух указанных типов (шаблон функции) |
Вычисления рациональных чисел во время компиляции
Заголовок <ratio> предоставляет типы и функции для работы с рациональными числами во время компиляции.
Последовательности целых чисел во время компиляции
Определено в заголовке <utility> |
|
|---|---|
|
(C++14) | реализует последовательность целых чисел во время компиляции (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/meta