在编译时获取静态constexpr数组的最小/最大值

luc*_*0ni 45 c++ constexpr c++11

假设我有一个如下定义的整数数组:

static constexpr int IntArray[] = {1, 5, 10, 12, 17};
Run Code Online (Sandbox Code Playgroud)

有没有办法在编译时获得最小值或最大值?

Que*_*tin 64

让我们为未来的搜索着陆器提供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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

在Coliru上看到它

  • @AndyG我认为这是一种疏忽.`const`数组的内容不是编译时常量,所以如果它实际上不是`constexpr`,那么在编译时根本不能做任何事情. (20认同)
  • @Quentin:我不会假设哈哈:-)我认为真正的答案是你的第二个声明"在编译时根本无法完成" (3认同)
  • 这在技术上并不能解决OP问题,因为你使用了'constexpr`而不是`static const` (2认同)
  • @AndyG ...然后你会推荐*不*包括关于`constexpr`案例的信息,这实际上有用吗? (2认同)