Udostępnij za pośrednictwem


integer_sequence — klasa

Reprezentuje sekwencję całkowitą. Może służyć do deduce i rozszerzania pakietów parametrów w typach wariadycznych, takich jak std::tuple<T...> przekazywanych jako argumenty do funkcji.

Składnia

template <class T, T... Vals>
struct integer_sequence

Parametry

T
Typ wartości; musi być typem całkowitoliczbowym: bool, char, char16_t, char32_t, wchar_t lub typy ze znakiem lub bez znaku liczby całkowitej.

Vals
Pakiet parametrów innych niż typ, który reprezentuje sekwencję wartości typu całkowitego T.

Członkowie

Nazwa/nazwisko opis
static size_t size() noexcept Liczba elementów w sekwencji.
typedef T value_type Typ każdego elementu w sekwencji. Musi być typem całkowitym.

Uwagi

Pakiet parametrów przekazywany bezpośrednio do funkcji można rozpakować bez żadnych specjalnych pomocników biblioteki. Gdy pakiet parametrów jest częścią typu, który jest przekazywany do funkcji i potrzebujesz indeksów, aby uzyskać dostęp do elementów, najprostszym sposobem rozpakowania go jest użycie integer_sequence i jego powiązanych aliasów make_integer_sequencetypów , , index_sequencemake_index_sequencei index_sequence_for.

Przykład

Poniższy przykład jest oparty na pierwotnej propozycji N3658. Pokazano w nim, jak za pomocą elementu utworzyć integer_sequence element std::tuple na podstawie std::array<T,N>elementu i jak używać elementu integer_sequence , aby uzyskać dostęp do elementów członkowskich krotki.

a2t W funkcji element jest index_sequence aliasem integer_sequence opartym na typie całkowitymsize_t. make_index_sequence jest aliasem, który w czasie kompilacji tworzy zero oparte index_sequence na tej samej liczbie elementów co tablica przekazywana przez obiekt wywołujący. a2t przekazuje wartość index_sequence by do a2t_ , gdzie wyrażenie a[I]... rozpakuje Ielement , a następnie elementy są przekazywane, co make_tuple zużywa je jako poszczególne argumenty. Jeśli na przykład sekwencja zawiera trzy elementy, make_tuple jest wywoływana jako make_tuple(a[0], a[1], a[2]). Same elementy tablicy mogą być oczywiście dowolnym typem.

Funkcja apply akceptuje krotkę std::tuple i tworzy obiekt integer_sequence przy użyciu klasy pomocniczej tuple_size . Należy pamiętać, że element std::d ecay_t jest niezbędny, ponieważ tuple_size nie działa z typami referencyjnymi. Funkcja apply_ rozpakuje elementy członkowskie krotki i przekazuje je jako oddzielne argumenty do wywołania funkcji. W tym przykładzie funkcja jest prostym wyrażeniem lambda, które wyświetla wartości.

#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;
}

Aby utworzyć element index_sequence dla pakietu parametrów, użyj<index_sequence_for języka T...> który jest aliasem dla make_index_sequence<parametru sizeof... (T)>

Wymagania

Nagłówek: <type_traits>

Przestrzeń nazw: std

Zobacz też

Wielokropek i szablony Wariadyczne