Przekazywanie do funkcji w C++ n-argumentów

Czasami kiedy piszemy jakąś funkcję tak naprawdę nie wiemy ile będziemy potrzebowali obsłużyć w niej danych. Wiąże się to z pewnym problem gdyż nie możemy po prostu napisać, że dana funkcja przyjmuje 2, 3 albo 4 argumenty. Oczywiście twórcy C++ zwrócili uwagę na ten problem i zaimplementowali specjalny mechanizm umożliwiający odczytywanie n argumentów. Mamy więc możliwość „przesyłania” do danej funkcji praktycznie nieograniczonej liczby danych (jedynym ograniczeniem jest dostępna pamięć operacyjna).

Fot:  ideonexus.com, Flickr | CC.

Fot: ideonexus.com, Flickr | CC.

Mamy zwykłą funkcję mnozenie() przyjmującą dwa argumenty:

Możemy ją oczywiście w prosty sposób przetestować:

Jak widać wszystko działa poprawnie. Ale co jeśli nie znamy liczby liczb, które chcemy pomnożyć? Aby rozwiązać ten problem musimy wprowadzić drobne modyfikacje:

Oczywiście przy nieznanej liczbie argumentów, zawsze musimy wiedzieć jaką wartość ma ten podawany na początku oraz samym końcu ponieważ musimy w odpowiednim momencie zakończyć wykonywanie pętli aby nie dopuścić do błędu.

Jak widać na powyższym przykładzie listę argumentów będziemy przechowywać w obiekcie va_list nazwaListy; natomiast przegląd wszystkich argumentów rozpoczynamy uruchamiając funkcję va_start(nazwaListy, pierwszyArgument);. Poszczególne dane odczytywane są za pomocą funkcji va_arg(nazwaListy, typDanych);. Warto jeszcze wspomnieć że na końcu wymagane jest zamknięcie naszej listy za pomocą va_end(nazwaListy);.

Podana wyżej funkcja mnozenie() przyjmująca n argumentów, będzie mnożyć podane liczby do momentu wystąpienia 0:

, , , , , , , , , , ,