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

47

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

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

是否有一种方法可以在编译时获取最小或最大值?


6
使用递归的 constexpr 函数可能可以实现这个功能。 - Some programmer dude
在C++中,可能可以使用模板元编程来解决它。 - vsz
1个回答

67
让我们先来看一下 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上实时查看

(涉及IT技术,展示代码)

@Quentin 这里。只需从 constexpr_min()arrayMin_impl() 中删除引用返回类型即可。 - vsoftco
2
这并不完全回答了OP的问题,因为你使用了constexpr而不是static const - AndyG
20
我认为这是一个疏忽。 const 数组的内容不是编译时常量,所以如果它实际上不是 constexpr,则根本无法在编译时执行任何操作。 - Quentin
3
@Quentin:哈哈,我不会假设任何事情 :-) 我认为真正的答案是你的第二个陈述:“在编译时根本无法做任何事情”。 - AndyG
3
@AndyG...那么您是否建议包括有关constexpr情况的信息,这实际上是有用的? - Kyle Strand
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接