Синтаксическая проблема при заполнении массива выражением сгиба

Да я могу использовать std::initializer_list, Да, еще проще, я могу сделать агрегатную инициализацию. Но как это работает? Я не могу складывать голову вокруг выражений сгиба C ++ 17. Там не достаточно примеров.

Вот что я придумал:

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

РЕДАКТИРОВАТЬ: Компилируется с последним Clang. Сложенные выражения поддерживаются.

Живой пример: http://coliru.stacked-crooked.com/a/777dc32da6c54892

13

Решение

Вам нужно сложить оператор запятой, который также решает проблему секвенирования.

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

Другие решения

Поскольку оператор запятой является левоассоциативным, в идеале вы должны использовать левую унарную складку:

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

Актерский состав void чтобы убедиться, что используется встроенный оператор запятой. В этом случае вручение на самом деле не имеет значения.

4

По вопросам рекламы [email protected]