Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 

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

Содержание

[править] Свойства типов

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

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

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

[править] Базовые классы

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

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

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

[править] Отношения типа

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

Все эти свойства типа соответствуют 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>
вариативная логическая метафункция И
(шаблон класса) [править]
вариативная логическая метафункция ИЛИ
(шаблон класса) [править]
(C++17)
логическая метафункция НЕ
(шаблон класса) [править]

[править] Отношения элементов

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

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

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

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

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