std::integer_sequence
Определено в заголовочном файле <utility> | ||
template<class T, T... Ints> class integer_sequence; | (начиная с C++14) | |
Шаблон класса std::integer_sequence
представляет последовательность целых чисел времени компиляции. При использовании в качестве аргумента шаблона функциипакет параметровInts
может быть выведен и использован в расширении пакета.
Содержание |
[править]Параметры шаблона
T | — | целочисленный тип, используемый для элементов последовательности |
...Ints | — | пакет параметров не типов, представляющий последовательность |
[править]Типы элементов
Тип элемента | Определение |
value_type | T |
[править]Функции-элементы
size [static] | возвращает количество элементов в Ints (public static функция-элемент) |
std::integer_sequence::size
staticconstexprstd::size_t size()noexcept; | ||
Возвращает количество элементов в Ints
. Эквивалентно sizeof...(Ints)
Параметры
(нет)
Возвращаемое значение
Количество элементов в Ints
.
[править]Вспомогательные шаблоны
Вспомогательный псевдоним шаблона std::index_sequence
определён для общего случая, когда T
равен std::size_t:
template<std::size_t... Ints> using index_sequence = std::integer_sequence<std::size_t, Ints...>; | ||
Вспомогательные псевдонимы шаблонов std::make_integer_sequence
и std::make_index_sequence
определены для упрощения создания типов std::integer_sequence
и std::index_sequence
соответственно, с Ints
равным 0, 1, 2, ..., N-1
:
template<class T, T N> using make_integer_sequence = std::integer_sequence<T, /* последовательность 0, 1, 2, ..., N-1 */>; | ||
template<std::size_t N> using make_index_sequence = std::make_integer_sequence<std::size_t, N>; | ||
Программа некорректна, если N
отрицательное. Если N
равно нулю, указанный тип это integer_sequence<T>
.
Вспомогательный псевдоним шаблона std::index_sequence_for
определён для преобразования любого пакета параметров типа в индексную последовательность той же длины:
template<class... T> using index_sequence_for = std::make_index_sequence<sizeof...(T)>; | ||
[править]Примечание
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_integer_sequence | 201304L | (C++14) | Целочисленные последовательности времени компиляции |
[править]Пример
Примечание: другой пример смотрите в разделе Возможная реализация в std::apply
.
#include <tuple>#include <iostream>#include <array>#include <utility> // средство отладкиtemplate<typename T, T... ints>void print_sequence(std::integer_sequence<T, ints...> int_seq){std::cout<<"Последовательность размера "<< int_seq.size()<<": ";((std::cout<< ints <<' '), ...);std::cout<<'\n';} // преобразовывает массив в кортежtemplate<typename Array, std::size_t... I>auto a2t_impl(const Array& a, std::index_sequence<I...>){returnstd::make_tuple(a[I]...);} template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>>auto a2t(conststd::array<T, N>& a){return a2t_impl(a, Indices{});} // красивая печать кортежаtemplate<class Ch, class Tr, class Tuple, std::size_t... Is>void print_tuple_impl(std::basic_ostream<Ch,Tr>& os, const Tuple& t, std::index_sequence<Is...>){((os <<(Is ==0?"":", ")<<std::get<Is>(t)), ...);} template<class Ch, class Tr, class... Args>auto& operator<<(std::basic_ostream<Ch, Tr>& os, conststd::tuple<Args...>& t){ os <<"("; print_tuple_impl(os, t, std::index_sequence_for<Args...>{});return os <<")";} int main(){ print_sequence(std::integer_sequence<unsigned, 9, 2, 5, 1, 9, 1, 6>{}); print_sequence(std::make_integer_sequence<int, 20>{}); print_sequence(std::make_index_sequence<10>{}); print_sequence(std::index_sequence_for<float, std::iostream, char>{}); std::array<int, 4> array ={1, 2, 3, 4}; // преобразование массива в кортежauto tuple = a2t(array); static_assert(std::is_same_v<decltype(tuple), std::tuple<int, int, int, int>>, ""); // печать его в coutstd::cout<<"Кортеж: "<< tuple <<'\n';}
Вывод:
Последовательность размера 7: 9 2 5 1 9 1 6 Последовательность размера 20: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Последовательность размера 10: 0 1 2 3 4 5 6 7 8 9 Последовательность размера 3: 0 1 2 Кортеж: (1, 2, 3, 4)
[править]Смотрите также
(C++20) | создаёт объект std::array из встроенного массива (шаблон функции) |