◐ Shell
clean mode source ↗

Библиотека метапрограммирования — cppreference.com

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

Свойства типов

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

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

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

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

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

Предоставляются две специализации 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
(шаблон класса) [править]
проверяет, является ли тип std::nullptr_t
(шаблон класса) [править]
проверяет, является ли тип целочисленным типом
(шаблон класса) [править]
проверяет, является ли тип типом с плавающей запятой
(шаблон класса) [править]

(C++11)

проверяет, является ли тип типом массива
(шаблон класса) [править]

(C++11)

проверяет, является ли тип типом перечисления
(шаблон класса) [править]

(C++11)

проверяет, является ли тип типом объединения
(шаблон класса) [править]

(C++11)

проверяет, является ли тип типом класса не объединения
(шаблон класса) [править]
проверяет, является ли тип типом функции
(шаблон класса) [править]
проверяет, является ли тип типом указателя
(шаблон класса) [править]
проверяет, является ли тип левосторонней ссылкой
(шаблон класса) [править]
проверяет, является ли тип правосторонней ссылкой
(шаблон класса) [править]
проверяет, является ли тип указателем на нестатический объект-элемент
(шаблон класса) [править]
проверяет, является ли тип указателем на нестатическую функцию-элемент
(шаблон класса) [править]
Категории составных типов

Определены в заголовочном файле <type_traits>

проверяет, является ли тип фундаментальным типом
(шаблон класса) [править]
проверяет, является ли тип арифметическим типом
(шаблон класса) [править]

(C++11)

проверяет, является ли тип целочисленным типом
(шаблон класса) [править]

(C++11)

проверяет, является ли тип объектным типом
(шаблон класса) [править]
проверяет, является ли тип составным типом
(шаблон класса) [править]
проверяет, является ли тип либо левосторонней ссылкой, либо правосторонней ссылкой
(шаблон класса) [править]
проверяет, является ли тип указателем на нестатическую функцию-элемент или объект-элемент
(шаблон класса) [править]
Свойства типа

Определены в заголовочном файле <type_traits>

(C++11)

проверяет, является ли тип квалифицированным как const
(шаблон класса) [править]
проверяет, является ли тип volatile квалифицированным
(шаблон класса) [править]
проверяет, является ли тип тривиальным
(шаблон класса) [править]
проверяет, можно ли тривиально скопировать тип
(шаблон класса) [править]
проверяет, является ли тип типом со стандартной компоновкой
(шаблон класса) [править]

(C++11)(устарело в C++20)

проверяет, является ли тип типом данных с простой структурой (POD)
(шаблон класса) [править]

(C++11)(устарело в C++17)(удалено в C++20)

проверяет, является ли тип литеральным
(шаблон класса) [править]
проверяет, влияет ли каждый бит в представлении объекта типа на его значение
(шаблон класса) [править]

(C++11)

проверяет, является ли тип классовым типом (но не объединением) и не имеет нестатических элементов данных
(шаблон класса) [править]
проверяет, является ли тип типом полиморфного класса
(шаблон класса) [править]
проверяет, является ли тип типом абстрактного класса
(шаблон класса) [править]

(C++14)

проверяет, является ли тип окончательным классовым типом
(шаблон класса) [править]
проверяет, является ли тип агрегатным типом
(шаблон класса) [править]
проверяет, является ли тип типом с неявным временем жизни
(шаблон класса) [править]

(C++11)

проверяет, является ли тип арифметическим типом со знаком
(шаблон класса) [править]
проверяет, является ли тип беззнаковым арифметическим типом
(шаблон класса) [править]
проверяет, является ли тип типом массива с известной границей
(шаблон класса) [править]
проверяет, является ли тип типом массива с неизвестной границей
(шаблон класса) [править]
проверяет, является ли тип типом перечисления с ограниченной областью видимости
(шаблон класса) [править]
Поддерживаемые операции

Определены в заголовочном файле <type_traits>

проверяет, есть ли у типа конструктор для определённых аргументов
(шаблон класса) [править]
проверяет, есть ли у типа конструктор по умолчанию
(шаблон класса) [править]
проверяет, есть ли у типа конструктор копирования
(шаблон класса) [править]
проверяет, может ли тип быть сконструирован из правосторонней ссылки
(шаблон класса) [править]
проверяет, есть ли у типа оператор присваивания для определённого аргумента
(шаблон класса) [править]
проверяет, есть ли у типа оператор присваивания копированием
(шаблон класса) [править]
проверяет, есть ли у типа оператор присваивания перемещением
(шаблон класса) [править]
проверяет, есть ли у типа неудалённый деструктор
(шаблон класса) [править]
проверяет, есть ли у типа виртуальный деструктор
(шаблон класса) [править]
проверяет, можно ли объекты одного типа обменять с объектами того же или другого типа
(шаблон класса) [править]
проверяет, привязана ли ссылка к временному объекту в прямой инициализации
(шаблон класса) [править]
проверяет, привязана ли ссылка к временному объекту при инициализации копированием
(шаблон класса) [править]

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

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

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

Определены в заголовочном файле <type_traits>

получает требования к выравниванию типа
(шаблон класса) [править]
получает количество измерений типа, являющегося массивом
(шаблон класса) [править]
получает размер типа массива по указанному измерению
(шаблон класса) [править]

Отношения типа

Свойства отношения типа можно использовать для запроса отношений между типами во время компиляции.

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

Определены в заголовочном файле <type_traits>

(C++11)

проверяет, являются ли два типа одним и тем же типом
(шаблон класса) [править]
проверяет, является ли тип производным от другого типа
(шаблон класса) [править]
проверяет, можно ли преобразовать тип в другой тип
(шаблон класса) [править]
проверяет, являются ли два типа совместимыми по компоновке
(шаблон класса) [править]
проверяет, является ли тип взаимопреобразуемым по указателю (изначально) базовым классом другого типа
(шаблон класса) [править]
проверяет, может ли тип быть вызван (как если бы std::invoke) с заданными типами аргументов
(шаблон класса) [править]

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

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

Все эти свойства типа соответствуют TransformationTrait.

Константно-волатильные спецификаторы

Определены в заголовочном файле <type_traits>

удаляет спецификаторы const и/или volatile из данного типа
(шаблон класса) [править]

(C++11)(C++11)(C++11)

добавляет спецификаторы const и/или volatile к данному типу
(шаблон класса) [править]
Ссылки

Определены в заголовочном файле <type_traits>

удаляет ссылку из данного типа
(шаблон класса) [править]
добавляет левостороннюю или правостороннюю ссылку к данному типу
(шаблон класса) [править]
Модификаторы знака

Определены в заголовочном файле <type_traits>

делает данный целочисленный тип знаковым
(шаблон класса) [править]
делает данный целочисленный тип беззнаковым
(шаблон класса) [править]
Массивы

Определены в заголовочном файле <type_traits>

удаляет одну размерность из данного типа массива
(шаблон класса) [править]
удаляет все измерения из данного типа массива
(шаблон класса) [править]
Указатели

Определены в заголовочном файле <type_traits>

удаляет указатель из данного типа
(шаблон класса) [править]
добавляет указатель в данный тип
(шаблон класса) [править]
Другие преобразования

Определены в заголовочном файле <type_traits>

(C++11)(устарело в C++23)

определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера
(шаблон класса) [править]

(C++11)(устарело в C++23)

определяет тип, подходящий для использования в качестве неинициализированного хранилища для всех данных типов
(шаблон класса) [править]

(C++11)

применяет преобразования типов, как при передаче аргумента функции по значению
(шаблон класса) [править]
объединяет std::remove_cv и std::remove_reference
(шаблон класса) [править]

(C++11)

условно удаляет перегрузку функции или специализацию шаблона из разрешения перегрузки
(шаблон класса) [править]
выбирает тот или иной тип на основе логического значения времени компиляции
(шаблон класса) [править]
определяет общий тип группы типов
(шаблон класса) [править]
определяет общий ссылочный тип группы типов
(шаблон класса) [править]
получает базовый целочисленный тип для данного типа перечисления
(шаблон класса) [править]

(C++11)(удалено в C++20)(C++17)

выводит тип результата вызова вызываемого объекта с набором аргументов
(шаблон класса) [править]

(C++17)

псевдоним шаблона с переменным числом аргументов типа void
(псевдоним шаблона) [править]
возвращает аргумент тип без изменений
(шаблон класса) [править]

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

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

Отношения элементов

Определены в заголовочном файле <type_traits>

проверяет, являются ли объекты типа взаимопреобразуемыми по указателю с указанным подобъектом этого типа
(шаблон функции) [править]
проверяет, соответствуют ли два указанных элемента друг другу в общей начальной подпоследовательности двух указанных типов
(шаблон функции) [править]

Рациональная арифметика времени компиляции

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

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

Определены в заголовочном файле <utility>

реализует последовательность целых чисел на этапе компиляции
(шаблон класса) [править]