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
Czy nie powinno to być co najmniej '(arr [i ++] = pack ...)'? –
@VaughnCato Expression zawiera nieskomplikowany pakiet parametrów 'pack' - więc Clang narzeka. – DeiDei
Jak powiedział Vaughn: "error: pack expansion nie zawiera żadnych nieskomplikowanych paczek parametrów" – Deduplicator