Я знаю, что это не очень хорошая практика, и есть лучшие решения для решения этой проблемы, но, как практика для параметров многоточия, я нашел, что это хорошее упражнение.
Этот код работает для моего компилятора (VS2013), и я сожалею, что мне пришлось использовать встроенную сборку, но первая идея использовать локальную переменную стека не могла работать из-за организации стека.Итак, вот оно:
#include <iostream>
#include <cstdarg>
#include <stdint.h>
using namespace std;
double avg(double * sp, ...);
#define AVERAGE(n, ...) \
{ \
int * stackP; \
__asm { \
__asm mov ebx, esp \
__asm mov stackP, ebx \
} \
double a = avg(stackP, n, __VA_ARGS__); \
cout << "Average is: " << a << endl; \
}
template <typename T>
double avg(int * sp, T n, ...)
{
va_list list;
va_start(list, n);
double result = n;
unsigned int count = 1;
T * pArg = 0;
while (sp > reinterpret_cast<int *>(pArg + 1))
{
pArg = &(va_arg(list, T));
result += *pArg;
count++;
}
va_end(list);
result /= count;
return result;
}
void main()
{
AVERAGE(1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6);
AVERAGE(1.2, 1.3, 1.4, 1.5, 1.6);
AVERAGE(1.2, 1.3, 1.4);
AVERAGE(2, 3, 4);
AVERAGE(2, 3, 4, 5, 6);
}