integer_sequence – třída
Představuje celočíselnou sekvenci. Lze použít k odstranění a rozšíření balíčků parametrů variadic typech, jako je std::tuple<T...> které jsou předány jako argumenty funkce.
Syntaxe
template <class T, T... Vals>
struct integer_sequence
Parametry
T
Typ hodnot; musí být celočíselný typ: bool, char, char16_t, char32_t, wchar_t nebo typy celých čísel se znaménkem nebo bez znaménka.
Vals
Sada parametrů bez typu, která představuje sekvenci hodnot celočíselného typu T.
Členové
Název | Popis |
---|---|
static size_t size() noexcept |
Počet prvků v posloupnosti. |
typedef T value_type |
Typ každého prvku v sekvenci. Musí být celočíselný typ. |
Poznámky
Balíček parametrů, který je předán přímo funkci, lze rozbalit bez jakýchkoli speciálních pomocných rutin knihovny. Pokud je balíček parametrů součástí typu, který je předán funkci, a potřebujete indexy pro přístup k prvkům, pak nejjednodušší způsob, jak rozbalit, je použít integer_sequence
a jeho související aliasy make_integer_sequence
typu , index_sequence
, make_index_sequence
, a index_sequence_for
.
Příklad
Následující příklad vychází z původního návrhu N3658. Ukazuje, jak použít integer_sequence
k vytvoření z objektu std::tuple
std::array<T,N>
a jak použít integer_sequence
k získání členů řazené kolekce členů.
a2t
Ve funkci index_sequence
je alias integer_sequence
založený na celočíselném size_t
typu. make_index_sequence
je alias, který v době kompilace vytvoří nulový index_sequence
počet prvků jako pole předávané volajícím. a2t
předá index_sequence
hodnotu a2t_
hodnotou , kde výraz a[I]...
rozbalí I
a poté se prvky předávají make_tuple
, které je spotřebovávají jako jednotlivé argumenty. Pokud například sekvence obsahuje tři prvky, je make_tuple
volána jako make_tuple(a[0], a[1], a[2]). Samotné prvky pole mohou být samozřejmě libovolným typem.
Funkce apply přijímá std::tuple a vytvoří integer_sequence
pomocí tuple_size
pomocné třídy. Všimněte si, že std::d ecay_t je nezbytný, protože tuple_size nefunguje s odkazovými typy. Funkce apply_
rozbalí členy řazené kolekce členů a předá je jako samostatné argumenty volání funkce. V tomto příkladu je funkce jednoduchý výraz lambda, který vypíše hodnoty.
#include <stddef.h>
#include <iostream>
#include <tuple>
#include <utility>
#include <array>
#include <string>
using namespace std;
// Create a tuple from the array and the index_sequence
template<typename Array, size_t... I>
auto a2t_(const Array& a, index_sequence<I...>)
{
return make_tuple(a[I]...);
}
// Create an index sequence for the array, and pass it to the
// implementation function a2t_
template<typename T, size_t N>
auto a2t(const array<T, N>& a)
{
return a2t_(a, make_index_sequence<N>());
}
// Call function F with the tuple members as separate arguments.
template<typename F, typename Tuple = tuple<T...>, size_t... I>
decltype(auto) apply_(F&& f, Tuple&& args, index_sequence<I...>)
{
return forward<F>(f)(get<I>(forward<Tuple>(args))...);
}
// Create an index_sequence for the tuple, and pass it with the
// function object and the tuple to the implementation function apply_
template<typename F, typename Tuple = tuple<T...>>
decltype(auto) apply(F&& f, Tuple&& args)
{
using Indices = make_index_sequence<tuple_size<decay_t<Tuple>>::value >;
return apply_(forward<F>(f), forward<Tuple>(args), Indices());
}
int main()
{
const array<string, 3> arr { "Hello", "from", "C++14" };
//Create a tuple given a array
auto tup = a2t(arr);
// Extract the tuple elements
apply([](const string& a, const string& b, const string& c) {cout << a << " " << b << " " << c << endl; }, tup);
char c;
cin >> c;
}
Chcete-li vytvořit index_sequence
balíček parametrů, použijte index_sequence_for
<T...> což je alias pro make_index_sequence
<velikost... (T)>
Požadavky
Záhlaví: <type_traits>
Obor názvů: std