T smallestOf(const int count, const T val1, ... )
когда вы звоните так: smallestOf(3, 10, 20, 30)
varargs 20 30
(потому что 10
равно val1
).Поэтому вам нужно count - 1
.
Также strong рекомендация: не используйте varargs.Используйте шаблоны с переменным числом аргументов или std::initializer_list
Вы говорите, что не имеете доступа к C ++ 11, поэтому, к сожалению, не имеете доступа ни к шаблонам с переменным числом аргументов, ни к спискам инициализаторов.
Что ж, здесьмой подарок для вас:
template <class T> T min(T e1) { return e1; }
template <class T> T min(T e1, T e2) { return e1 < e2 ? e1: e2; }
template <class T> T min(T e1, T e2, T e3) { return min(e1, min(e2, e3)); }
template <class T> T min(T e1, T e2, T e3, T e4) { return min(e1, min(e2, e3, e4)); }
template <class T> T min(T e1, T e2, T e3, T e4, T e5) { return min(e1, min(e2, e3, e4, e5)); }
template <class T> T min(T e1, T e2, T e3, T e4, T e5, T e6) { return min(e1, min(e2, e3, e4, e5, e6)); }
template <class T> T min(T e1, T e2, T e3, T e4, T e5, T e6, T e7) { return min(e1, min(e2, e3, e4, e5, e6, e7)); }
template <class T> T min(T e1, T e2, T e3, T e4, T e5, T e6, T e7, T e8) { return min(e1, min(e2, e3, e4, e5, e6, e7, e8)); }
template <class T> T min(T e1, T e2, T e3, T e4, T e5, T e6, T e7, T e8, T e9) { return min(e1, min(e2, e3, e4, e5, e6, e7, e8, e9)); }
template <class T> T min(T e1, T e2, T e3, T e4, T e5, T e6, T e7, T e8, T e9, T e10) { return min(e1, min(e2, e3, e4, e5, e6, e7, e8, e9, e10)); }
Вы можете испытать искушение сказать, что это неоптимально или вы можете сгруппировать вызовы так, чтобы было меньше вызовов, но любой достойный компилятор встроит и оптимизирует все эти вызовы длявы.И clang
, и gcc
компилируют min<int,....>
с 10 параметрами только с инструкциями mov
cmp
и cmov
.