« integer_sequence, szablon struktury, C++ »
integer_sequence - Szablon struktury reprezentujący sekwencje liczb całkowitych czasu kompilacji (szablon struktury)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Hasło nie zostało zweryfikowane
Niniejsze hasło zostało opracowane, jednak nie zostało ono zweryfikowane przez administrację serwisu. Jeżeli znalazłeś błędy merytoryczne w niniejszym dokumencie, prosimy o ich zgłoszenie na forum w dziale Znalezione błędy.
Opracował: baziorek
« Standard C++14 »

integer_sequence

[szablon struktury] Szablon struktury reprezentujący sekwencje liczb całkowitych czasu kompilacji

Składnia

C/C++
#include <utility>
namespace std
{
    template < typename T, T...Ints >
    class integer_sequence;
}

Parametry szablonu

ParametrOpis
Ttyp liczb całkowitych użytych w sekwencji
...Intssekwencja liczb całkowitych typu T

Typy składowe

NazwaDefinicja
value_typeT

Metody klasy

MetodaOpis
static constexpr std::size_t size() noexcept;
metoda zwracająca ilość elementów sekwencji

Opis szczegółowy

Szablon klasy ze zmienną liczbą argumentów przyjmujący sekwencję liczb całkowitych, na których można operować w trakcie kompilacji.

Dodatkowe informacje

Do sekwencji liczb istnieją pomocne szablony aliasów:
C/C++
namespace std
{
    template < std::size_t...Ints >
    using index_sequence = std::integer_sequence < std::size_t, Ints...>;
   
    template < typename T, T N >
    using make_integer_sequence = std::integer_sequence < T, /* sekwencja 0, 1, 2, ..., N-1 */ >;
   
    template < std::size_t N >
    using make_index_sequence = make_integer_sequence < std::size_t, N >;
   
    template < class...T >
    using index_sequence_for = std::make_index_sequence < sizeof...( T ) >;
}
Dla N poniżej 0 program jest narażony na błędy (ang. "ill-formed").

Rzucane wyjątki

Tworzenie sekwencji liczb odbywa się na etapie kompilacji, dlatego wyjątki nie są rzucane.

Wymagania

Kompilator zgodny z C++14, lub posiadający implementację tego szablonu struktury.

Implementacja

C/C++
namespace std
{
    template < typename T, T...elements >
    struct sequence
    {
        typedef T value_type;
       
        static constexpr std::size_t size() noexcept
        {
            return sizeof...( elements );
        }
    };
}

Przykład

C/C++
#include <iostream>
#include <utility>
using namespace std;


template < typename T, T...sequence >
constexpr std::ostream & operator <<( std::ostream & os, const std::integer_sequence < T, sequence...>& )
{
    constexpr T values[] = { sequence...};
    for( auto a: values )
         os << a << ", ";
   
    return os;
}


template < typename T, T...sequence >
void printSequence( const std::integer_sequence < T, sequence...>& );

template < typename T >
void printSequence( const std::integer_sequence < T >& )
{ }

template < typename T, T t, T...sequence >
void printSequence( const std::integer_sequence < T, t, sequence...>& )
{
    cout << t << ", ";
    printSequence( std::integer_sequence < T, sequence...>() );
}


template < size_t N, typename T, T...sequence >
T get( const std::integer_sequence < T, sequence...>& );

template < size_t N, typename T, T t, T...sequence >
T get( const std::integer_sequence < T, t, sequence...>& )
{
    return N ? get < N - 1 >( std::integer_sequence < T, sequence...>() )
        : t;
}


int main()
{
    auto sequence1 = integer_sequence < int, 2, 4, 6, 8, 10, 12 >();
    auto sequence2 = index_sequence < 1, 3, 5, 7, 9 >();
   
    auto sequence3 = make_integer_sequence < unsigned, 4 >();
    auto sequence4 = make_index_sequence < 3 >();
   
    cout << sequence1 << endl;
    cout << sequence2 << endl;
    cout << sequence3 << endl;
    cout << sequence4 << endl;
   
   
    printSequence( sequence1 );
    cout << endl;
   
    printSequence( integer_sequence < size_t > { } );
   
   
    cout << "Element from sequence {" << sequence1 << "} with index 2: " << get < 2 >( sequence1 ) << endl;
}
Standardowe wyjście programu:
2, 4, 6, 8, 10, 12,
1, 3, 5, 7, 9,
0, 1, 2, 3,
0, 1, 2,
2, 4, 6, 8, 10, 12,
Element from sequence {2, 4, 6, 8, 10, 12, } with index 2: 6
Przykład na quicksort w trakcie kompilacji przy użyciu integer_sequence.

Zagadnienia powiązane

tupleUmożliwia tworzenie zbiorów danych o ustalonej liczbie elementów różnych typów. (szablon klasy)