В C ++ 11 и более поздних версиях это очень просто:
template<typename... Arguments>
void printFunction(Arguments &&...args) {
auto noOfArgs = sizeof...(Arguments);
Тем не менее, вы используете старый стиль, простой - C, стиль макроса препроцессора, который сильно отличается. Во-первых, чтобы использовать макросы препроцессора, у вас должен быть хотя бы один именованный параметр, который будет использоваться для запуска va_list
, и это начало осложнений.
Я думаю, что не существует стандартного способа посчитать количество аргументов, это может быть реализовано несколькими способами, если это то, что вы действительно спрашиваете, который я бы пометил как C
вместо C++
.
Как получить доступ к аргументы: есть два варианта, назовем его «пулемет» и «капельно-капельно-капельно» - это мои имена -:
#include <utility>
template<typename... Ts>
void ignoreResults(Ts &&...) {}
template<typename Argument>
int machineGunBullet(Argument &&arg);
inline void drip() {} // do nothing
template<typename A1, typename... Tail>
void drip(A1 &&a1, Tail &&...tail) {
// do something here with a1
drip(std::forward<Tail>(tail)...);
}
template<typename... Arguments>
void printFunction(Arguments &&...args) {
ignoreResults(machineGunBullet(std::forward<Arguments>(args))...);
// or
drip(std::forward<Arguments>(args)...);
}
Это сборка в проводнике компилятора, https://godbolt.org/z/aSx2wv