Объясните, как работает передаче переменного количества значений в прототипе функции f? Почему тут явно указан тип S, в то время когда в других примерах использования передачи переменного числа значений, тип передаваемых значений не указывается?(просто пишут многоточие). Как работать с переданными значениями?
enum S {A,B,C};
void f(int n, S ...);
Во-первых в записи void f(int n, S ...); S не задает тип передаваемых значений. На самом деле эта запись эквивалентна void f(int n, S /*unnamed*/, ...);, т.е. S - эти тип второго аргумента без имени.
Тип значений, передаваемых через ... вообще никак не задается. Они передаются как блок, содержащий указатели void *, double и целочисленные типы (в соответствии с правилами преобразования для целочисленных типов).
Также не стоит путать variadic функции с шаблонами функций, где как раз можно задавать тип передаваемых значений:
template<typename ... Values>
void f(int, Values ... values);
Values - пак с типами параметров
Из стандарта: 8.3.5.4:
Там, где это синтаксически корректно и где лексема «...» не является частью абстрактного-описателя, форма «,...» считается синонимом формы «...».
Так что это просто функция, получающая аргументы int, S и что угодно. Синоним
void f(int n, S, ...);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей