2016-03-26 15 views
1

, bunun (toplam başlatma kullanarak) aşağıdaki şekilde başlatıldı edilebilir bulmak:Std :: dizi agrega başlatma ve şablon entegre tip <code>std::array</code> arasında <a href="http://en.cppreference.com/w/cpp/container/array" rel="nofollow">documentation</a> kaynaktan

struct S { 
    S(): arr{0,1} { } 
    std::array<int,2> arr; 
}; 

Yine, bir sorun, bu durumda ortaya çıkan : 0 den N-1 için değerler ile, örnek olarak (s oluşturarak veya bir constexpr ed fonksiyonunu kullanarak bir dizi sunabilmesi nasıl

template<int N> 
struct S { 
    S(): arr{/*??*/} { } 
    std::array<int,N> arr; 
}; 

p hangi dizinleri eşek)?

cevap

4

Bakın std::iota arasında kitlesel olarak kullanılamaması güç: Gerçekten agrega başlatma kullanmak istiyorsanız

template <int N> 
struct S { 
    S() { 
     std::iota(arr.begin(), arr.end(), 0); 
    } 

    std::array<int, N> arr; 
}; 

rağmen, std::integer_sequence (her zaman var gerektirir C++ 14 ama üzerinde C++ 11 çözümlerin çok şey var SO):

template <int N> 
struct S { 
    S() : S(std::make_integer_sequence<int, N>{}) {} 

    std::array<int, N> arr; 
private: 
    template <int... Is> 
    S(std::integer_sequence<int, Is...>) 
     : arr{Is...} 
    { } 
}; 
+0

Bu bir delege kurucu değil mi? –

+1

@LorahAttkins Doğru. Ve bunu özel yapma, böylece geçersiz bir sırada kimsenin geçememesi. – Barry

+0

std :: iota 'std :: array' std :: vector' ile kullanıldığında ne hakkında? Vektörlerin iki kere başlatılması anlamına gelmez mi? – skypjack

İlgili konular