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

std::integral_constant

Материал из cppreference.com
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(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)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
<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:

<tbody> </tbody>
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 функция-элемент) [править]
Возвращает значение из обёртки
(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");
}