Spec-Zone.ru › C++

std::integral_constant

Определено в заголовочном файле <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>

Константы-члены

Имя Значение
value
[статическая]
v
(открытая статическая константа-член)

Функции-члены

operator value_type
возвращает обёрнутое значение
(открытая функция-член)
operator()
(C++14)
возвращает обёрнутое значение
(открытая функция-член)

std::integral_constant::operator value_type

constexpr operator value_type() const noexcept;

Функция преобразования. Возвращает обёрнутое значение.

std::integral_constant::operator()

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; // using injected-class-name
    constexpr operator value_type() const noexcept { return value; }
    constexpr value_type operator()() const noexcept { return value; } // since 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>

using two_t = std::integral_constant<int, 2>;
using four_t = std::integral_constant<int, 4>;

static_assert(not std::is_same_v<two_t, four_t>);
static_assert(two_t::value * 2 == four_t::value, "2*2 != 4");
static_assert(two_t() << 1 == four_t() >> 0, "2*2 != 4");

enum class E{ e1, e2 };
using c1 = std::integral_constant<E, E::e1>;
using c2 = std::integral_constant<E, E::e2>;
static_assert(c1::value != E::e2);
static_assert(c1() == E::e1);
static_assert(std::is_same_v<c2, c2>);

int main() {}

См. также

integer_sequence
(C++14)
реализует последовательность целых чисел времени компиляции
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/integral_constant

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API