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

std::integer_sequence

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(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++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
integer_sequence
(C++14)
 
Определено в заголовочном файле <utility>
template<class T, T... Ints>
class integer_sequence;
(начиная с C++14)

Шаблон класса std::integer_sequence представляет последовательность целых чисел времени компиляции. При использовании в качестве аргумента шаблона функциипакет параметровInts может быть выведен и использован в расширении пакета.

Содержание

[править]Параметры шаблона

T целочисленный тип, используемый для элементов последовательности
...Ints пакет параметров не типов, представляющий последовательность

[править]Типы элементов

Тип элемента Определение
value_typeT

[править]Функции-элементы

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_sequence201304L(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 из встроенного массива
(шаблон функции)[править]
close