2013-08-14 3 views
1

Таким образом, у меня есть функция, которая принимает список переменных аргументов длины, например:C++ Передайте массив вместо списка аргументов переменной длины

int avg(int count,...){ 
    //stuff 
} 

Я могу назвать его avg(4,2,3,9,4); и она отлично работает. Он должен поддерживать эту функциональность.

Есть ли способ для меня также вызвать его с помощью массива вместо перечисления переменных? Например:

avg(4,myArray[5]) такой, что функция avg не видит никакой разницы?

+0

Нет, не существует. Было бы намного проще изменить функцию, чтобы взять список инициализаторов. – chris

+1

Перегрузка функций? – keyser

+0

Перегрузка функции представляет мне ту же проблему. Я все еще не могу иметь список аргументов с динамической длиной во время выполнения. Я понимаю, что существует тысячи способов сделать это без '...', но мне было интересно, могу ли я это сделать без изменения функции. – slicedtoad

ответ

4

Нет такого пути. Однако вы можете сделать две функции: одну, которая принимает переменное количество аргументов, и одну, которая принимает массив (или, еще лучше, std::vector). Первая функция просто упаковывает аргументы в массив (или вектор) и вызывает вторую функцию.

+0

Хорошо, спасибо, я думал, что это невозможно, но я хотел убедиться. Я надеялся, что может быть какой-то способ напечатать в любом типе список аргументов переменной длины. – slicedtoad

2

Нет. Поскольку указатели представляют собой целые числа без знака, он не сможет определить разницу между адресом памяти и целым числом без знака. В качестве альтернативы (как я уверен, что вы хотели бы избежать), вы должны сделать:

avg(4, myArray[ 0 ], ..., myArray[ 3 ]); 

... где ... является myArray в положениях 1 и 2 если вы хотите, чтобы соответствовать с теми же параметрами, как ваш предыдущая функция. Существуют и другие способы сделать это, например, использовать векторы C++.

3
void f() {} 

template<typename T, std::size_t N> 
void f(T array[N]) 
{ 
} 

template<typename T, typename... Args> 
void f(const T& value, const Args&... args) 
{ 
    process(value); 
    f(args...); 
} 
Смежные вопросы