web-dev-qa-db-ja.com

コンパイル時に静的constexpr配列の最小/最大値を取得します

そのように定義された整数の配列があるとしましょう:

static constexpr int IntArray[] = {1, 5, 10, 12, 17};

コンパイル時に最小値または最大値を取得する方法はありますか?

45
lucab0ni

C++ 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);

C++ 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でライブ表示

64
Quentin