Шаблоны функций с неограниченным числом параметров
Добавлено: 20 янв 2005, 13:30
Написал шаблоны функций, возращающих минимальное/максимальное
значение из 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];
}
значение из 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];
}