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
相关产品推荐
相关产品推荐

