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

C++11如何通过类型推导选择矩阵拷贝函数的双重指针返回类型

C++11 嵌套矩阵入参的二级指针返回类型推导实现

核心思路是通过类型萃取,从传入的二维嵌套结构中提取最内层的元素类型,最终返回的二级指针就是指向该元素类型的二级指针,全程不需要显式指定模板参数。


步骤1:实现通用元素类型萃取模板

需要同时兼容STL嵌套容器、C风格二维数组两种入参场景,利用C++模板偏特化匹配不同类型的结构:

#include <type_traits>

// 基础萃取模板
template <typename T>
struct MatrixElemType;

// 匹配STL风格两层嵌套容器:外层容器value_type为内层容器,内层容器value_type为目标元素类型
template <typename Outer>
struct MatrixElemType {
    using InnerContainer = typename Outer::value_type;
    using type = typename InnerContainer::value_type;
};

// 匹配C风格二维数组 T[M][N]
template <typename T, size_t M, size_t N>
struct MatrixElemType<T[M][N]> {
    using type = T;
};

// 匹配C风格二维数组的引用传参场景 T(&)[M][N]
template <typename T, size_t M, size_t N>
struct MatrixElemType<T(&)[M][N]> {
    using type = T;
};

// 便捷别名,自动剥离入参的引用、const修饰
template <typename T>
using MatrixElemT = typename MatrixElemType<
    typename std::remove_cv<
        typename std::remove_reference<T>::type
    >::type
>::type;

步骤2:用尾置返回类型定义函数

有了类型萃取之后,尾置返回类型直接写提取到的元素类型的二级指针即可:

template <typename MatrixType>
auto CreateMatrix(MatrixType&& M) -> MatrixElemT<MatrixType>**
{
    using ElemType = MatrixElemT<MatrixType>;
    // 以下替换为你已经实现的内存分配、拷贝逻辑即可
    // 1. 行数获取:STL容器调用M.size(),C风格数组用std::extent<MatrixType, 0>::value获取
    // 2. 先分配一级指针数组:ElemType** mat = new ElemType*[row_cnt];
    // 3. 逐行分配非连续内存,逐元素拷贝入参内容到新内存
    // ...
}

常见错误说明

你之前写的template <typename MatrixType> MatrixType** CreateMatrix(MatrixType M)推导失败的原因非常直接:MatrixType是整个外层容器的完整类型,比如传入std::vector<std::deque<double>>时,MatrixType被推导为std::vector<std::deque<double>>,此时MatrixType**是指向该vector类型的二级指针,和你需要的double**完全不是一个类型,自然无法通过编译。

测试用例

#include <vector>
#include <deque>
int main() {
    // vector嵌套deque
    std::vector<std::deque<double>> mat1 = {{1.1, 2.2}, {3.3, 4.4, 5.5}};
    auto p1 = CreateMatrix(mat1); // p1自动推导为double**

    // C风格二维数组
    int mat2[2][3] = {{1,2,3}, {4,5,6}};
    auto p2 = CreateMatrix(mat2); // p2自动推导为int**

    // deque嵌套vector
    std::deque<std::vector<int>> mat3 = {{1}, {2,3}, {4,5,6,7}};
    auto p3 = CreateMatrix(mat3); // p3自动推导为int**

    return 0;
}

内容的提问来源于stack exchange,提问作者casual

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41