如何在编译期检查const数组元素是否单调递增?
编译期检查数组单调递增并触发编译错误
给定数组:
const int g_Values[] = { ... };
需求是在编译期验证数组元素是否严格单调递增(即满足g_Values[i] < g_Values[i + 1]),且当验证不通过时直接触发编译错误,替代原有的运行时检查逻辑。
实现方案(C++17及以上)
利用C++17支持的constexpr循环,结合static_assert实现编译期检查:
- 先实现一个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; }
- 使用
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
相关产品推荐
相关产品推荐

