2016-01-02 13 views
13

Evet, std::initializer_list kullanıyorum. Evet, daha da kolay, toplu başlatma yapabilirim. Ama bu nasıl çalışıyor? Kafamı C + + 17'nin kıvrım ifadeleri etrafında katlayamıyorum. Orada yeterli örnek yok.Bir kat ifade ile bir dizi doldururken sözdizimi sorunu

Burada ile geldi ne:

template<class T, std::size_t N> 
struct foo 
{ 
    T arr[N]; 

    template<typename... Args> 
    constexpr foo(Args&&... pack) 
    { 
     static_assert(sizeof...(pack) <= N, "Too many args"); 
     std::size_t i = 0; 
     (arr[i++] = ...); 
    } 
}; 

int main() 
{ 
    foo<int, 5> a(1, 2, 3, 4, 5); 
} 

DÜZENLEME

: son Clang ile derleniyor. Katlama ifadeleri desteklenir.

Canlı örnek: Ayrıca sıralama sorunu çözer virgül operatörü ile kat gereken http://coliru.stacked-crooked.com/a/777dc32da6c54892

+1

En azından bu olmamalı mıydı (arr [i ++] = pack ...) '? –

+0

@VaughnCato Expression, paketlenmemiş parametre paketi 'pack' içeriyor - bu yüzden Clang şikayet ediyor. – DeiDei

+0

Vaughn'un dediği gibi: "hata: paket genişletme, herhangi bir genişletilmemiş parametre paketi içermiyor" – Deduplicator

cevap

13

.

(...,void(arr[i++] = pack)) 

void için dökme dahili virgül operatörü kullanıldığından emin emin olmaktır: virgül operatörü ilişkilendirilebilir bırakılır yana

(void(arr[i++] = pack) , ...); 
+2

Evet, mükemmel çalışıyor. Bu sözdiziminin benim için kafa karıştırmaya başlamadan önce biraz zaman alacak. Birisi yazdığında mükemmel mantıklı görünüyor. : D – DeiDei

+0

Ve coliru hakkında http://coliru.stacked-crooked.com/a/f59078c078d25340 – Deduplicator

+1

@ Jarod42 Hayır, ',' sıralama dizileri. –

4

, ideal bir sol tekli kat kullanacaktır. Bu durumda, ahlaksızlık aslında önemli değil.

+2

Farketmez. Her ikisi de ((a, b), c) 've' (a, (b, c)) '' a' sonra 'b' sonra' c''yi değerlendirir. –

+1

@ T.C .: (void) oyuncu kadrosuyla, bu doğru, ama uygun el kullanmanın alışkanlığını kazanmanın en iyi yolu. –

+0

@ T.C .: Ve evet, işlev stili döküm daha güzel. –