std::integral_constant
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <type_traits>
|
||
template< class T, T v > struct integral_constant; |
(начиная с C++11) | |
std::integral_constant является обёрткой над статической константой определённого типа. Она является базовым классом для свойств типов C++.
Поведение программы, добавляющей специализации для std::integral_constant не определено.
Вспомогательные псевдонимы шаблонов
Вспомогательный псевдоним шаблона типа std::bool_constant определён для частного случая, когда T является bool:
template< bool B > using bool_constant = integral_constant<bool, B>; |
(начиная с C++17) | |
Специализации
Предоставляются два определения типов для частного случая, когда T является bool.
Определены в заголовочном файле
<type_traits> | |
| Тип | Определение |
true_type
|
std::integral_constant<bool, true>
|
false_type
|
std::integral_constant<bool, false>
|
Типы-элементы
| Тип | Определение |
value_type
|
T
|
type
|
std::integral_constant<T, v>
|
Константы-элементы
| Имя | Значение |
значение constexpr T [static] |
статическая константа типа T со значением v (public static константа-элемент) |
Функции-элементы
| Возвращает значение из обёртки (public функция-элемент) | |
(C++14) |
Возвращает значение из обёртки (public функция-элемент) |
std::integral_constant::operator value_type
<tbody> </tbody> constexpr operator value_type() const noexcept; |
||
Функция преобразования. Возвращает значение из обёртки.
std::integral_constant::operator()
<tbody> </tbody> constexpr value_type operator()() const noexcept; |
(начиная с C++14) | |
Возвращает обёрнутое значение. Эта функция позволяет std::integral_constant служить источником функциональных объектов времени компиляции.
Возможная реализация
template<class T, T v>
struct integral_constant
{
static constexpr T value = v;
using value_type = T;
using type = integral_constant; // использует имя внедряющего класса
constexpr operator value_type() const noexcept { return value; }
constexpr value_type operator()() const noexcept { return value; } // начиная с c++14
};
|
Примечание
| Макрос тест функциональности | Значение | Стандарт | Комментарий |
|---|---|---|---|
__cpp_lib_integral_constant_callable |
201304L |
(C++14) | std::integral_constant::operator()
|
__cpp_lib_bool_constant |
201505L |
(C++17) | std::bool_constant
|
Пример
Запустить этот код
#include <type_traits>
int main()
{
typedef std::integral_constant<int, 2> two_t;
typedef std::integral_constant<int, 4> four_t;
static_assert(not std::is_same<two_t, four_t>::value,
"two_t и four_t равны!");
static_assert(two_t::value * 2 == four_t::value, "2*2 != 4");
enum class my_e { e1, e2 };
typedef std::integral_constant<my_e, my_e::e1> my_e_e1;
typedef std::integral_constant<my_e, my_e::e2> my_e_e2;
static_assert(my_e_e1() == my_e::e1);
static_assert(my_e_e1::value != my_e::e2,
"my_e_e1::value == my_e::e2");
static_assert(std::is_same<my_e_e2, my_e_e2>::value,
"my_e_e2 != my_e_e2");
}