Namespaces
Variants

Metaprogramming library (since C++11)

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences

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

Содержание

Определения

Следующие типы в совокупности называются referenceable types :

Для любого ссылочного типа T может быть создана ссылка на него [1] .

  1. Для ссылочных типов это может быть выполнено с помощью reference collapsing .

Трейты типов

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

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

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

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

Большинство нетрансформирующих характеристик типов должны быть публично и однозначно унаследованы от std::integral_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
(шаблон класса)
(C++11) ( DR* )
проверяет, является ли тип std::nullptr_t
(шаблон класса)
проверяет, является ли тип целочисленным типом
(шаблон класса)
проверяет, является ли тип типом с плавающей запятой
(шаблон класса)
(C++11)
проверяет, является ли тип массивным типом
(шаблон класса)
(C++11)
проверяет, является ли тип перечислением
(шаблон класса)
(C++11)
проверяет, является ли тип объединением
(шаблон класса)
(C++11)
проверяет, является ли тип классом, не являющимся объединением
(шаблон класса)
проверяет, является ли тип функциональным типом
(шаблон класса)
(C++11)
проверяет, является ли тип указателем
(шаблон класса)
проверяет, является ли тип lvalue reference
(шаблон класса)
проверяет, является ли тип rvalue reference
(шаблон класса)
проверяет, является ли тип указателем на нестатический член-объект
(шаблон класса)
проверяет, является ли тип указателем на нестатическую функцию-член
(шаблон класса)
Категории составных типов
Определено в заголовке <type_traits>
проверяет, является ли тип фундаментальным типом
(шаблон класса)
проверяет, является ли тип арифметическим типом
(шаблон класса)
(C++11)
проверяет, является ли тип скалярным типом
(шаблон класса)
(C++11)
проверяет, является ли тип объектным типом
(шаблон класса)
проверяет, является ли тип составным типом
(шаблон класса)
проверяет, является ли тип либо lvalue reference , либо rvalue reference
(шаблон класса)
проверяет, является ли тип указателем на нестатическую функцию-член или объект
(шаблон класса)
Свойства типов
Определено в заголовке <type_traits>
(C++11)
проверяет, является ли тип константно-квалифицированным
(шаблон класса)
проверяет, является ли тип квалифицированным как volatile
(шаблон класса)
(C++11) (deprecated in C++26)
проверяет, является ли тип тривиальным
(шаблон класса)
проверяет, является ли тип тривиально копируемым
(шаблон класса)
проверяет, является ли тип стандартным расположением
(шаблон класса)
(C++11) (deprecated in C++20)
проверяет, является ли тип простым типом данных (POD)
(шаблон класса)
(C++11) (устарело в C++17) (удалено в C++20)
проверяет, является ли тип литеральным типом
(шаблон класса)
проверяет, что каждый бит в объектном представлении типа влияет на его значение
(шаблон класса)
(C++11)
проверяет, является ли тип классом (но не объединением) и не имеет нестатических членов данных
(шаблон класса)
проверяет, является ли тип полиморфным классом
(шаблон класса)
проверяет, является ли тип абстрактным классом
(шаблон класса)
(C++14)
проверяет, является ли тип финальным классом
(шаблон класса)
проверяет, является ли тип агрегатным типом
(шаблон класса)
проверяет, является ли тип типом с неявным временем жизни
(шаблон класса)
(C++11)
проверяет, является ли тип знаковым арифметическим типом
(шаблон класса)
проверяет, является ли тип беззнаковым арифметическим типом
(шаблон класса)
проверяет, является ли тип типом массива с известной границей
(шаблон класса)
проверяет, является ли тип массивом неизвестной границы
(шаблон класса)
проверяет, является ли тип ограниченным перечислением
(шаблон класса)
Поддерживаемые операции
Определено в заголовке <type_traits>
проверяет, имеет ли тип конструктор для конкретных аргументов
(шаблон класса)
проверяет, имеет ли тип конструктор по умолчанию
(шаблон класса)
проверяет, имеет ли тип конструктор копирования
(шаблон класса)
проверяет, может ли тип быть сконструирован из rvalue-ссылки
(шаблон класса)
проверяет, имеет ли тип оператор присваивания для конкретного аргумента
(шаблон класса)
проверяет, имеет ли тип оператор копирующего присваивания
(шаблон класса)
проверяет, имеет ли тип оператор перемещающего присваивания
(шаблон класса)
проверяет, имеет ли тип неудалённый деструктор
(шаблон класса)
проверяет, имеет ли тип виртуальный деструктор
(шаблон класса)
проверяет, могут ли объекты типа быть обменены с объектами того же или другого типа
(шаблон класса)
проверяет, связана ли ссылка с временным объектом при прямой инициализации
(шаблон класса)
проверяет, связана ли ссылка с временным объектом при копирующей инициализации
(шаблон класса)

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

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

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

Определено в заголовочном файле <type_traits>
получает требования к выравниванию типа
(шаблон класса)
(C++11)
получает количество измерений типа массива
(шаблон класса)
(C++11)
получает размер типа массива по указанному измерению
(шаблон класса)

Отношения между типами

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

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

Определено в заголовке <type_traits>
(C++11)
проверяет, являются ли два типа одинаковыми
(шаблон класса)
(C++11)
проверяет, является ли тип базовым для другого типа
(шаблон класса)
проверяет, является ли тип виртуальным базовым для другого типа
(шаблон класса)
проверяет, может ли тип быть преобразован в другой тип
(шаблон класса)
проверяет, являются ли два типа layout-совместимыми
(шаблон класса)
проверяет, является ли тип pointer-interconvertible (начальным) базовым типом другого типа
(шаблон класса)
проверяет, может ли тип быть вызван (как с помощью std::invoke ) с заданными типами аргументов
(шаблон класса)

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

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

Все эти признаки типов удовлетворяют требованиям TransformationTrait .

Спецификаторы константности и волатильности
Определено в заголовочном файле <type_traits>
удаляет const и/или volatile спецификаторы из заданного типа
(шаблон класса)
(C++11) (C++11) (C++11)
добавляет const и/или volatile спецификаторы к заданному типу
(шаблон класса)
Ссылки
Определено в заголовочном файле <type_traits>
удаляет ссылку из заданного типа
(шаблон класса)
добавляет lvalue или rvalue ссылку к заданному типу
(шаблон класса)
Модификаторы знака
Определено в заголовочном файле <type_traits>
получает соответствующий знаковый тип для заданного целочисленного типа
(шаблон класса)
получает соответствующий беззнаковый тип для заданного целочисленного типа
(шаблон класса)
Массивы
Определено в заголовочном файле <type_traits>
удаляет одну размерность из заданного типа массива
(шаблон класса)
удаляет все размерности из заданного типа массива
(шаблон класса)
Указатели
Определено в заголовочном файле <type_traits>
удаляет указатель из заданного типа
(шаблон класса)
добавляет указатель к заданному типу
(шаблон класса)
Другие преобразования
Определено в заголовочном файле <type_traits>
(since C++11) (deprecated in C++23)
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера
(шаблон класса)
(since C++11) (deprecated in C++23)
определяет тип, подходящий для использования в качестве неинициализированного хранилища для всех заданных типов
(шаблон класса)
(C++11)
применяет преобразования типов, как при передаче аргумента функции по значению
(шаблон класса)
объединяет std::remove_cv и std::remove_reference
(шаблон класса)
(C++11)
условно удаляет перегрузку функции или специализацию шаблона из разрешения перегрузки
(шаблон класса)
выбирает один из двух типов на основе булевого значения времени компиляции
(шаблон класса)
определяет общий тип группы типов
(шаблон класса)
определяет общий ссылочный тип группы типов
(шаблон класса)
получает базовый целочисленный тип для заданного типа перечисления
(шаблон класса)
(C++11) (удалено в C++20) (C++17)
выводит тип результата вызова вызываемого объекта с набором аргументов
(шаблон класса)
(C++17)
void вариативный псевдоним шаблона
(псевдоним шаблона)
возвращает аргумент типа без изменений
(шаблон класса)

Логические операции (since C++17)

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

Определено в заголовке <type_traits>
вариативная метафункция логического И
(шаблон класса)
вариативная метафункция логического ИЛИ
(шаблон класса)
(C++17)
метафункция логического НЕ
(шаблон класса)

Отношения членов (since C++20)

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

Арифметика рациональных чисел на этапе компиляции

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

Целочисленные последовательности времени компиляции (since C++14)

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