不同长度std::array如何转为同类型范围传入process_result处理函数
解决方案
你面临的核心问题是std::array<T, N>的长度属于类型的一部分,std::array<int, 3>和std::array<int, 5>是完全独立的类型,需要一个类型擦除的连续范围视图来统一承载二者,同时满足constexpr上下文的使用要求。
C++20及以上版本最优方案
直接使用std::span<const int>作为RangeType即可,这是零开销的标准库视图类型,完美适配不同长度的std::array<int, N>,且原生支持constexpr:
#include <array> #include <span> constexpr std::array<int, 3> a1{1, 2, 3}; constexpr std::array<int, 5> a2{1, 2, 3, 4, 5}; constexpr void process_result(std::span<const int> range) { for (auto elem: range) { // 对elem执行相关操作 } } // 调用示例,无需手动转换,array可隐式转为span constexpr void test_call() { process_result(a1); process_result(a2); }
方案说明
std::span本身不持有数据,仅存储起始指针和长度,运行时开销为0- 所有元素类型匹配的连续容器(不同长度的
std::array、C风格数组、std::vector等)都可以隐式转换为对应类型的std::span - C++20起
std::span的构造、迭代器操作均支持constexpr,完全适配编译期常量上下文的使用需求
C++17及以下版本兼容方案
如果使用的标准版本低于C++20,可以自行实现简易的constexpr数组视图:
#include <array> #include <cstddef> struct IntConstView { const int* data_ptr; size_t len; template<size_t N> constexpr IntConstView(const std::array<int, N>& arr) : data_ptr(arr.data()), len(N) {} constexpr const int* begin() const { return data_ptr; } constexpr const int* end() const { return data_ptr + len; } }; constexpr void process_result(IntConstView range) { for (auto elem: range) { // 对elem执行相关操作 } }
内容的提问来源于stack exchange,提问作者Dmitriano
相关产品推荐
相关产品推荐

