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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:52:37