2016-01-02 8 views
13

Sì, posso usare std::initializer_list. Sì, ancora più facile, posso fare l'inizializzazione di aggregazione. Ma come funziona? Non riesco a piegarmi sulle espressioni di piega di C++ 17. Non ci sono abbastanza esempi là fuori.Problema di sintassi quando si popola una matrice con un'espressione di piegatura

Ecco cosa mi è venuta:

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

EDIT: Compilare con ultima Clang. Le espressioni di piegatura sono supportate.

esempio dal vivo:http://coliru.stacked-crooked.com/a/777dc32da6c54892

+1

Non dovrebbe essere almeno '(arr [i ++] = pack ...)'? –

+0

@VaughnCato Expression contiene il pacchetto di parametri non espanso 'pack', quindi Clang si lamenta. – DeiDei

+0

Come ha detto Vaughn: "errore: l'espansione del pacchetto non contiene alcun pacchetto di parametri non espansi" – Deduplicator

risposta

13

È necessario piegare con l'operatore virgola, che risolve anche il problema di sequenziamento.

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

Sì, funziona perfettamente. Ci vorrà un po 'di tempo prima che questa sintassi non mi confonda. Sembra perfettamente logico quando qualcun altro lo scrive. : D – DeiDei

+0

E su coliru http://coliru.stacked-crooked.com/a/f59078c078d25340 – Deduplicator

+1

@ Jarod42 No, ',' gestisce il sequenziamento. –

4

Dal momento che l'operatore virgola viene lasciata-associativa, si sarebbe ideale utilizzare una piega unario sinistra:

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

Il cast di void è quello di assicurarsi che il incorporato-virgola operatore viene utilizzato. In questo caso, la manualità non conta davvero.

+2

Non importa. Entrambi '((a, b), c)' e '(a, (b, c)) 'valuta' a' quindi 'b' quindi' c'. –

+1

@ T.C .: Con un cast (nullo), è vero, ma sembra preferibile prendere l'abitudine di usare la mano giusta. –

+0

@ T.C .: E sì, il cast di stile è più bello. –