Если коротко, то распаковка варьируемых аргументов может происходить только в конструкции list-initializer. В моем примере я использую лямда функцию в которую распаковываются аргументы и она ничего не возвращает, поэтому и дописываю 0 в список инициализации, через запятую. И получаю такую конструкцию:
C++ Source Code:
{ (add(args), 0)... } // ... - для распаковки
Соответственно я эту конструкцию должен использовать только там, где применяется list-initializer. Например как аргумент для std::initializer_list.
Это может быть и объявление массива, вроде int a[] = { args... };
Ну я думаю суть ты понял.
Этот код корректно работает и со специализациями foo. Но есть ограничение: элементы енума должны быть последовательными (т.к. доступ к следующему вычисляется как предыдущий + 1).
Блин, или я идиот, или одно из двух... Сделал две реализации -- одну на шаблонах, а другую на статичных массивах с указателями на функции. Казалось бы, что шаблоны развернутся прямо в нужные функции, и это будет быстрее чем обращаться через обёртку -- но нет, через обёртку процентов на 10% быстрее. wat?