Как перебрать шаблон с переменным числом аргументов?

Как перебрать шаблон с переменным числом аргументов? грубо говоря есть функция

template <typname... T>
void test(T1... args) 
{

}

Как мне перебрать args?


Ответы (1 шт):

Автор решения: HolyBlackCat

Вот так. Это называется fold expression.

#include <iostream>

template <typename... T>
void test(T ...args) 
{
    ([&]{
        std::cout << args << '\n';
    }(), ...);
}

int main()
{
    test(1, 2, 3);
}

Лямбда вызывается N раз. Внутри нее args ссылается на очередной элемент args....


В fold expression вместо , может быть любой бинарный оператор, например +.

Т.е. сумму всех аргументов можно получить так: return (args + ...);, или, если нужно, чтобы это работало для 0 аргументов, то так: return (args + ... + 0);.


Какая-то версия MSVC у меня давилась синтаксисом выше, но сейчас повторить не получается. Как обходной вариант работала лямбда с параметром ([&](auto x){...}(args), ...).

→ Ссылка