Шаблоны функций с неограниченным числом параметров

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Дрюль
Сообщения: 18
Зарегистрирован: 15 окт 2004, 16:14

Написал шаблоны функций, возращающих минимальное/максимальное
значение из n параметров (nmin и nmax) и из списка параметров, последний из которых равен нулю (imin и imax соответственно). Для int'ов и doubl'ов работает правильно (вроде). А с float творится какая-то чушь. Потом переписал эти шаблоны, изменив их так, что они возвращают не значение, а ССЫЛКУ на него. С типом float та же фигня. Помогите, пожалуйста, отыскать баг.


template <typename T>
T nmin (int n, ...) {
int *p = &n; p++; n--;
T *tp = (T *)p, tmp = *tp++;
for (; n--; tp++)
if (*tp < tmp)
tmp = *tp;
return tmp;
}

template <typename T>
T nmax (int n, ...) {
int *p = &n; p++; n--;
T *tp = (T *)p, tmp = *tp++;
for (; n--; tp++)
if (*tp > tmp)
tmp = *tp;
return tmp;
}

template <typename T>
T imin (T a, ...) {
T *p = &a, tmp = a;
while (*p++)
if (*p < tmp)
tmp = *p;
return tmp;
}

template <typename T>
T imax (T a, ...) {
T *p = &a, tmp = a;
while (*p++)
if (*p > tmp)
tmp = *p;
return tmp;
}

template <typename T>
T& nmin (int n, ...) {
int *p = &n, ind = 0;
p++; n--;
T *tp = (T *)p;
for (int i = 0; n--; i++)
if (tp < tp[ind])
ind = i;
return tp[ind];
}

template <typename T>
T& nmax (int n, ...) {
int *p = &n, ind = 0;
p++; n--;
T *tp = (T *)p;
for (int i = 0; n--; i++)
if (tp > tp[ind])
ind = i;
return tp[ind];
}

template <typename T>
T& imin (T a, ...) {
int i = 0, ind = 0;
T *p = &a;
while (p[++i])
if (p < p[ind])
ind = i;
return p[ind];
}

template <typename T>
T& imax (T a, ...) {
int i = 0, ind = 0;
T *p = &a;
while (p[++i])
if (p > p[ind])
ind = i;
return p[ind];
}
ssDev
Сообщения: 50
Зарегистрирован: 20 янв 2005, 14:41

Если я правильно помню то в C/C++ параметры запихиваються в стек в обратном порядке т.е.
fun(x1,x2,x3)
в стеке будет
top-> x1,x2,x3->bottom
Вот только не помню стек растет в верх или вниз но помоему top старший адрес
Поэтому как работают твои функции я не понимаю.
Когда мне надо было написать что то подобное я писал:
void _cdecl F(int cod, LPCSTR lpszFmt, ...){
va_list marker;

va_start(marker, lpszFmt);
_vsnprintf(buf, SZ_LOG_BUFF-1, lpszFmt, marker);
va_end(marker);
:evil:
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Дрюль, приведи конкретный пример ошибки (как вызываешь в случае float). Есть подозрение, что это может происходить из-за одновременной посылки в функцию перменных типа float и литералов с ПТ (по умолчанию они трактуются как double, а чтобы были float, надо добавлять префикс F).

Советую также использовать стандартные макросы va_xxx.
Ответить