Работа с функцией с бесконечным количеством аргументов - func(...)

Рейтинг: 0Ответов: 1Опубликовано: 20.10.2014

Подскажите, как работать с таким троеточием в скобках. Мне нужна функция, которая суммирует неопределенное количество целых чисел. Можно примером или ссылкой на нормальный ресурс.

----ДОПОЛНЕНО ПОСЛЕ 2-х КОММЕНТАРИЕВ --------

    #include <iostream>

using namespace std;

void f(int a, ...){
int * p = &a;

while (*p){
    cout << *p << endl;
    p++;
}
}

int main(){
f(1, 3, 56, 4);

return 0;
}

---------------вывод-------------------------------------

1
3
56
4
22997204
30403626
2147303424
-858993460
-858993460
1245112
4305311
1
3430632
3421160
-1011716776
22997204
30403626
2147303424
-1302397296

Не пойму, откуда мусор берётся?

Ответы

▲ 2

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

#include <iostream>

using namespace std;

int summ(std::initializer_list<int> list)
{
    int s = 0;
    for (int x: list) {
        s += x;
    }
    return s;
}

int main() {
    int a = summ({1,2,3,4});
    cout << a << endl;
    return 0;
}

(компилировать нужно с ключом -std=c++0x)

Дополнительные фигурные скобки не так страшны, но плюсов приносят много. Можно даже такое написать func({1,2,3,4},{5,8,9}, "test"); - сразу понятно, что функция будет принимать два списка и строку (заголовок функции будет такой void func(std::initializer_list<int> list1, std::initializer_list<int> list2, std::string s);.