Zmienna lista argumentów w C++

Zalecana obsługa dowolnie długich list argumentów jest zaimplementowana w bibliotece stdarg:

#inlcude <stdarg.h>
lub
#inlcude <cstdarg>

Potrzebne makra:

void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
Wywołaniu va_start musi odpowiadać va_end (jeden do jeden, najlepiej na początku i na końcu funkcji). Musimy z góry znać liczbę argumentów, np. przekazując ją jako jeden z parametrów (nazwanych) funkcji - najlepiej ostatni (jesli ktoś chce się dowiedzieć jak to jest, że w printf nie podajemy ilości elementów, niech przeczyta przykład z linku poniżej).

Aby uzyć va_start musimy najpierw zdefiniować zmienną typu va_list, która będzie trzymać dla nas strukturę (wskaźnik) naszej listy parametrów. Drugim parametrem va_start jest oststni znany, nazwany parametr funkcji, najczęsciej coś w stylu paramCount.

Następnie odpowiednią ilośc razy wywołujemy va_arg, jako pierwszy przekazując zmienną reprezentującą listę, ako drugi przekazujemy nazwę typu którego żądamy. Nazwa typu może być różna w każdym wywołaniu, jednak zazwyczaj ograniczamy się do jednego, dwóch typów (dla prostoty).

Przykład:

void foo(int a, int b, int paramCount, ...){
	va_list ap;
	va_start(va_list ap, paramCount);
	for (int i = 0; i < paramCount; i++){
		printf("%d, ", va_arg(ap, int));
	}
	va_end(ap);
}

Zakładam, że państwo już to lub cos podobnego wygoogle'ali, ale dla pełności zamieszczam: cplusplus.com reference to cstdarg.

A tutaj, gdyby kogoś ciekawiło jak zrealizować funkcję printf (po swojemu): eprintf.