2016-01-02 9 views
13

Tak, mogę użyć std::initializer_list. Tak, jeszcze łatwiejsze, mogę przeprowadzić agregacyjną inicjalizację. Ale jak to działa? Nie mogę wydawać się zagiąć głową wokół wyrażeń fałdowania C++ 17. Nie ma wystarczającej liczby przykładów.Składnia problem przy wypełnianiu tablicy wyrażeniem krotnie

Oto co wymyśliłem:

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: Kompilacja z najnowszej Clang. Zagnieżdżanie wyrażenia są obsługiwane.

żywo przykład:http://coliru.stacked-crooked.com/a/777dc32da6c54892

+1

Czy nie powinno to być co najmniej '(arr [i ++] = pack ...)'? –

+0

@VaughnCato Expression zawiera nieskomplikowany pakiet parametrów 'pack' - więc Clang narzeka. – DeiDei

+0

Jak powiedział Vaughn: "error: pack expansion nie zawiera żadnych nieskomplikowanych paczek parametrów" – Deduplicator

Odpowiedz

13

trzeba złożyć z operatorem przecinek, który rozwiązuje również problem sekwencjonowania.

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

Tak, działa idealnie. To zajmie trochę czasu, zanim ta składnia nie będzie dla mnie myląca. Wygląda idealnie logicznie, gdy ktoś inny to pisze. : D – DeiDei

+0

I na coliru http://coliru.stacked-crooked.com/a/f59078c078d25340 – Deduplicator

+1

@ Jarod42 Nope, ',' obsługuje sekwencjonowanie. –

4

Ponieważ operator przecinek lewej zrzeszania się, byś najlepiej użyć w lewo krotnie jednoargumentowy:

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

Obsada do void jest upewnienie się, że wbudowany przecinek operator jest używany. W tym przypadku przekazanie nie ma znaczenia.

+2

Nie ma znaczenia. Zarówno '((a, b), c)' i '(a, (b, c))' ocenia 'a', następnie' b', a następnie 'c'. –

+1

@ T.C .: Z obsadą (void), to prawda, ale wydaje się, że najlepiej jest mieć zwyczaj używania właściwej ręki. –

+0

@ T.C .: I tak, obsada w stylu funkcyjnym jest przyjemniejsza. –

Powiązane problemy