To zależy.
Jaki jest główny cel tego kodu? To coś pożytecznego czy tylko nauka?
Jeśli chce się podszkolić w języku to często świadomie wybieram cięższą drogę. Próbuje napisać trudniejszą wersje (zaimplementować coś od zera, bardziej generycznie)
Ale jeśli programuję dla wyniku to idę na łatwiznę. Wykorzystuje biblioteki i maksymalnie upraszczam problem.
Np dla Twojego problemu wyznaczenia maksymalnej wartości w tablicy intów:
Wersja maksymalnie użyteczna:
int m = *max_element(std::begin(tab), std::end(tab));
Wersja mocno rozwijająca (sporo copy pasty, można by pewnie jakieś makra do tego popisać :P)
template <typename T, typename V = void>
struct is_n_eq_comparable : std::false_type {};
template <typename T>
struct is_n_eq_comparable<T, void_t<
decltype(declval<T>() != declval<T>())>> : std::true_type{};
template <typename T, typename V = void>
struct is_incrementable : std::false_type {};
template <typename T>
struct is_incrementable<T, void_t<
decltype(++declval<T&>())>> : std::true_type {};
template <typename T, typename V = void>
struct is_dereferencable : std::false_type {};
template <typename T>
struct is_dereferencable<T, void_t<
decltype(*declval<T>())>> : std::true_type {};
template <typename T, typename V = void>
struct is_dereference_less_comparable : std::false_type {};
template <typename T>
struct is_dereference_less_comparable<T, void_t<
decltype(*declval<T>() < *declval<T>())>> : std::true_type {};
template <typename T, typename std::enable_if<
is_n_eq_comparable<T>{} &&
is_incrementable<T>{} &&
is_dereferencable<T>{} &&
is_dereference_less_comparable<T>{}
, int>::type = 0>
T max_val(T start, T end) {
T current_max = start;
for (; start != end; ++start) {
if (*current_max < *start)
current_max = start;
}
return current_max;
}