2016-05-18 14 views
5

chcę zainicjować tablicę z sekwencji int s od 0 do N - 1sekwencji inicjalizacji tablicy z szablonem

#include <array> 
#include <iostream> 

template<unsigned N> 
struct XArray 
{ 
    static constexpr int array[N] = {XArray<N - 1>::array, N - 1}; 
}; 

template<> 
struct XArray<1> 
{ 
    static constexpr int array[1] = {0}; 
}; 


int main(void) 
{ 
    std::array<int, 10> const a{XArray<10>::array}; 

    for (int const & i : a) 
     std::cout << i << "\n"; 
    return 0; 
} 

próbowałem, ale to nie działa, ponieważ XArray<N - 1>::array w moim struktury muszą być int, a nie int *. Jak mogę to zrobić ? Jak "połączyć" wartości?

+1

To nie jest takie proste. W języku brakuje funkcji "wycenianych w paczce". Pojawiły się (na wpół żartujące) propozycje, które pozwoliły w pewnym momencie przeciążyć 'operatora ...' w tym celu, ale w tej chwili nic nie istnieje w tym języku. (Np. Co chcesz to 'int array [N] = {unpack () ...};', gdzie 'unpack' ma przeciążony' operator ... '.) –

+0

@KerrekSB Ow ...: (Nie ma sposobu, aby to zrobić, więc? – Boiethios

+0

Mam tylko jedno słowo: dlaczego –

Odpowiedz

4

Nie jestem pewien, czy spełnia to twoje wymagania.

#include <array> 
#include <iostream> 

template <size_t ...I> 
constexpr auto init(std::index_sequence<I...>) { 
    return std::array<size_t, sizeof...(I)>{I...}; 
} 

int main(void) 
{ 
    std::array<size_t, 10> a = init(std::make_index_sequence<10>()); 

    for (int const & i : a) 
     std::cout << i << "\n"; 
    return 0; 
} 
+0

Znam 'std :: index_sequence', ale jest to C++ 14, a nie 11 – Boiethios

+2

@Boiethios' std :: index_sequence' jest czystym rozszerzeniem biblioteki, można znajdź implementacje C++ 11 online. – TartanLlama

+0

obuduj go jak [this] (http://coliru.stacked-crooked.com/a/da0aa2c6a1d210f0). – TartanLlama