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
| static constexpr std::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...>) { return std::make_tuple(a[I]...); } template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>> auto a2t(const std::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, const std::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>>, ""); // печать его в cout std::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 из встроенного массива (шаблон функции) |