如何在编译期验证std::array尺寸与元素数量是否匹配?
C++20编译期检查constexpr std::array的有效元素数与指定大小匹配
完全可以用static_assert实现这个需求,C++20的constexpr特性支持编译期遍历数组、执行判断逻辑,下面是两种可行的实现方式:
方法1:自定义constexpr计数函数
先写一个编译期可执行的函数,统计数组中非空std::string_view的数量,再用static_assert对比这个数量和array_size:
#include <array> #include <string_view> constexpr int array_size = 6; static constexpr std::array<std::string_view, array_size> texts = {{"one", "two", "three"}}; constexpr int count_non_empty(const std::array<std::string_view, array_size>& arr) { int count = 0; for (auto sv : arr) { if (!sv.empty()) { ++count; } } return count; } // 编译期断言,不匹配则触发错误 static_assert(count_non_empty(texts) == array_size, "array_size必须与非空string_view的元素数量一致");
方法2:使用C++20 ranges算法(更简洁)
C++20的std::ranges::count_if支持constexpr调用,可以直接用它统计非空元素,省去自定义函数:
#include <array> #include <string_view> #include <ranges> constexpr int array_size = 6; static constexpr std::array<std::string_view, array_size> texts = {{"one", "two", "three"}}; static_assert(std::ranges::count_if(texts, [](auto sv) { return !sv.empty(); }) == array_size, "array_size与非空元素数量不匹配");
注意事项
- 两种方法都完全在编译期执行,不会产生运行时开销;
- 当数组中非空元素的数量不等于
array_size时,编译器会直接抛出static_assert中定义的错误信息,终止编译; - 如果你实际需求是初始化列表的元素个数必须等于array_size(而非检查非空),可以直接让编译器推导数组大小,但你的需求明确是检查有效(非空)元素,所以上述方案完全匹配。
内容的提问来源于stack exchange,提问作者Joost Baars
相关产品推荐
相关产品推荐

