Переменное число аргументов

182
30 ноября 2017, 02:24

Объясните, как работает передаче переменного количества значений в прототипе функции f? Почему тут явно указан тип S, в то время когда в других примерах использования передачи переменного числа значений, тип передаваемых значений не указывается?(просто пишут многоточие). Как работать с переданными значениями?

enum S {A,B,C};
void f(int n, S ...);
Answer 1

Во-первых в записи 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 - пак с типами параметров

Answer 2

Из стандарта: 8.3.5.4:

Там, где это синтаксически корректно и где лексема «...» не является частью абстрактного-описателя, форма «,...» считается синонимом формы «...».

Так что это просто функция, получающая аргументы int, S и что угодно. Синоним

void f(int n, S, ...);
READ ALSO
Вывод двух массивов

Вывод двух массивов

Есть исходный и отсортированный массивыСначала у меня выводятся оба массива, но если элементов в массиве меньше 8, то вывести их повторно,...

175
Рисование в консоли Visual Studio c++

Рисование в консоли Visual Studio c++

Учился писать код в паскалеПо ходу учебы перешел на с++ и Visual Studio

260
Можно ли сделать Bottom Sheet выдвигающимся за свайпом?

Можно ли сделать Bottom Sheet выдвигающимся за свайпом?

Нужно чтобы фрагмент вытягвался снизу экрана за движением пальцаМожно ли это сделать с помощью Bottom Sheet и если да, то как? (android

157
Синхронизация запроса

Синхронизация запроса

Есть приложение, в котором идет запрос на серверКак сделать чтобы прогресс бар ждал ответ от сервера и выводил что надо

187