You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在编译期检查const数组元素是否单调递增?

编译期检查数组单调递增并触发编译错误

给定数组:

const int g_Values[] = { ... };

需求是在编译期验证数组元素是否严格单调递增(即满足g_Values[i] < g_Values[i + 1]),且当验证不通过时直接触发编译错误,替代原有的运行时检查逻辑。

实现方案(C++17及以上)

利用C++17支持的constexpr循环,结合static_assert实现编译期检查:

  1. 先实现一个constexpr检查函数,逻辑和原运行时代码一致(从后往前遍历验证):
#include <cstddef> // 用于std::size_t

constexpr bool IsMonotonously(const int* arr, std::size_t size) {
    if (size <= 1) return true; // 空数组或单个元素默认满足条件
    int m = arr[size - 1];
    for (std::size_t i = size - 2;; --i) {
        int v = arr[i];
        if (v >= m) return false;
        m = v;
        if (i == 0) break;
    }
    return true;
}
  1. 使用static_assert触发编译错误:
// 编译期检查,不满足则直接报错
static_assert(IsMonotonously(g_Values, std::size(g_Values)), 
              "错误:数组g_Values不是严格单调递增的");

兼容C++11/14的版本(递归实现)

如果需要兼容更早的C标准,由于C11/14不支持constexpr循环,可改用递归方式实现:

#include <cstddef>

template<std::size_t N>
constexpr bool IsMonotonously(const int (&arr)[N], std::size_t idx = N - 1) {
    if (idx == 0) return true;
    int v = arr[idx - 1];
    if (v >= arr[idx]) return false;
    return IsMonotonously(arr, idx - 1);
}

// 编译期检查
static_assert(IsMonotonously(g_Values), 
              "错误:数组g_Values不是严格单调递增的");

关键说明

  • static_assert会在编译期对constexpr函数的返回值进行求值,若返回false则直接终止编译并输出指定错误信息,完全符合“编译期检查+报错”的需求。
  • 若项目中无法使用std::size,可自行实现一个constexpr的数组大小获取函数:
template<typename T, std::size_t N>
constexpr std::size_t array_size(const T (&)[N]) noexcept {
    return N;
}

使用时替换std::size(g_Values)为array_size(g_Values)即可。

内容的提问来源于stack exchange,提问作者lomo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:05:41