Obsługa takich argumentów możliwa jest z pomocą makr va_* i parsowania któregoś z argumentów. Jest to jednak technika silnie nie zalecana, pełna możliwości popełnienia błędu a wręcz zabroniona w embedded gdzie możesz zabić człowieka.
#include <stdarg.h>
#include <stdio.h>
double average(int count, ...) {
va_list ap;
int j;
double sum = 0;
va_start(ap, count);
for (i = 0; i < count; ++i) {
sum += va_arg(ap, int);
}
va_end(ap);
return sum / count;
}
int main(void) {
printf("%f\n", average(3, 1, 2, 3) );
return 0;
}
Ogólnie, możesz zobaczyć jak działa, poczytać ale .. bardzo staraj się tego nie robić. Tak... tylko że w C, jeśli nie chcesz przesyłać kontenera (tj. wskaźnika) i wielkości lub masz dane różnych typów, wymaga to niezłej gimnastyki :-/
Szczęśliwie dla C++ masz od C++11 "szablony wariadyczne". Dają możliwość przekazania dowolnych argumentów do funkcji:
#include <iostream>
template<typename T>
void showArguments(T t) {
std::cout << t << ' ';
}
template<typename T, typename... Args>
void showArguments(T t, Args... args) {
showArguments(t);
showArguments(args...);
}
int main() {
showArguments("kaczka", 23.3, 1231L, 3232.3F, []{});
std::cout << '\n';
}
W C++17 z kolei doszło fold expressions:
#include <iostream>
#include <type_traits>
template<typename... Args>
auto average(Args&&... args) -> std::common_type_t<Args...> {
return (args + ... ) / sizeof...(args);
}
int main() {
std::cout << average(1, 12.2, 33) << '\n';
}
A co do compare w C++17, zrobił bym je tak:
#include <iostream>
#include <iomanip>
template<typename... Args>
bool any(Args... args) { return ( ... || args); }
template<typename T, typename... Args>
bool myCompare(T t, Args... args) {
return any((t == args)...);
}
int main() {
std::cout << std::boolalpha
<< myCompare("ala", "maciej", "adam", "franek", "ala") << '\n';
std::cout << std::boolalpha
<< myCompare("ala", "maciej", "adam", "franek", "zenek") << '\n';
}