Sdílet prostřednictvím


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_sequencetypu , 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í Ia 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

Viz také

Tři tečky a Variadické šablony