C++20中如何手动实现支持多维数组的std::to_array?
实现支持多维数组的
std::to_array替代版本 C++20新增的std::to_array可以便捷地将一维C风格数组转换为std::array,示例用法如下:
template<typename T, std::size_t N> void foo(const T (&a)[N]) { auto arr = std::to_array(a); }
但它不支持多维数组的直接转换,比如auto arr = to_array({1, 2}, {3, 4});这类写法无法通过编译。我们可以手动实现一个支持多维数组的版本,通过递归模板处理每一层数组结构。
实现代码
#include <array> #include <type_traits> // 递归终止模板:处理非数组类型的元素 template<typename T> constexpr auto to_multi_array(T&& val) { return std::forward<T>(val); } // 数组特化模板:递归转换每一层C风格数组为std::array template<typename T, std::size_t N> constexpr auto to_multi_array(const T (&arr)[N]) { // 推导内层元素的转换结果类型(可能是嵌套的std::array) using InnerType = decltype(to_multi_array(arr[0])); std::array<InnerType, N> result{}; // 遍历原数组,递归转换每个元素 for (std::size_t i = 0; i < N; ++i) { result[i] = to_multi_array(arr[i]); } return result; }
用法示例
这个实现支持任意维度的C风格数组转换:
int main() { // 一维数组转换 int one_d[] = {1, 2, 3}; auto std_one_d = to_multi_array(one_d); // 类型为std::array<int, 3> // 二维数组转换 int two_d[2][2] = {{1, 2}, {3, 4}}; auto std_two_d = to_multi_array(two_d); // 类型为std::array<std::array<int, 2>, 2> // 三维数组转换 int three_d[2][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}}}; auto std_three_d = to_multi_array(three_d); // 类型为std::array<std::array<std::array<int,2>,2>,2> return 0; }
支持初始化列表的扩展
如果需要直接通过嵌套初始化列表创建多维std::array,可以添加如下重载(注意内层初始化列表的元素数量必须一致):
// 处理二维初始化列表的重载 template<typename T> constexpr auto to_multi_array(std::initializer_list<std::initializer_list<T>> il) { const std::size_t outer_size = il.size(); const std::size_t inner_size = il.begin()->size(); std::array<std::array<T, inner_size>, outer_size> result{}; std::size_t i = 0; for (const auto& inner_il : il) { std::size_t j = 0; for (const auto& val : inner_il) { result[i][j] = val; ++j; } ++i; } return result; }
使用示例:
auto arr = to_multi_array({{1, 2}, {3, 4}}); // 类型为std::array<std::array<int, 2>, 2>
内容的提问来源于stack exchange,提问作者Amir Kirsh
相关产品推荐
相关产品推荐

