Получите минимальное/максимальное значение статического массива constexpr во время компиляции Скажем, у меня есть массив целых чисел, определенных следующим образом: static constexpr int IntArray[] = {1, 5, 10, 12, 17}; Есть ли способ получить минимальное или максимальное значение во время компиляции? Ответ 1 Позвольте получить решение С++ 17 в сторону будущих поисковых серверов: constexpr int IntArray[] = {1, 5, 10, 12, 17}; constexpr int min = *std::min_element(std::begin(IntArray), std::end(IntArray)); static_assert(min == 1); С++ 11 более придирчив к функциям constexpr, поэтому нам нужно выкачать рекурсивный алгоритм. Это простой, линейный: template <class T> constexpr T &constexpr_min(T &a, T &b) { return a > b ? b : a; } template <class T> constexpr T &arrayMin_impl(T *begin, T *end) { return begin + 1 == end ? *begin : constexpr_min(*begin, arrayMin_impl(begin + 1, end)); } template <class T, std::size_t N> constexpr T &arrayMin(T(&arr)[N]) { return arrayMin_impl(arr, arr + N); } constexpr int IntArray[] = {1, 5, 10, 12, 17}; constexpr int min = arrayMin(IntArray); Посмотрите на живое на Coliru
Ответ 1 Позвольте получить решение С++ 17 в сторону будущих поисковых серверов: constexpr int IntArray[] = {1, 5, 10, 12, 17}; constexpr int min = *std::min_element(std::begin(IntArray), std::end(IntArray)); static_assert(min == 1); С++ 11 более придирчив к функциям constexpr, поэтому нам нужно выкачать рекурсивный алгоритм. Это простой, линейный: template <class T> constexpr T &constexpr_min(T &a, T &b) { return a > b ? b : a; } template <class T> constexpr T &arrayMin_impl(T *begin, T *end) { return begin + 1 == end ? *begin : constexpr_min(*begin, arrayMin_impl(begin + 1, end)); } template <class T, std::size_t N> constexpr T &arrayMin(T(&arr)[N]) { return arrayMin_impl(arr, arr + N); } constexpr int IntArray[] = {1, 5, 10, 12, 17}; constexpr int min = arrayMin(IntArray); Посмотрите на живое на Coliru