Подтвердить что ты не робот

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

Да, я могу использовать std::initializer_list. Да, еще проще, я могу выполнить общую инициализацию. Но как это работает? Я не могу свернуть голову вокруг 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);
}

EDIT: Компиляция с последним Clang. Поддерживаются выражения Fold.

Пример в реальном времени: http://coliru.stacked-crooked.com/a/777dc32da6c54892

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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