MST
星途 面试题库

面试题:C++ 模板元编程在多维数组参数处理中的应用

利用C++ 的模板元编程技术,设计一个通用的函数模板,该模板能够接收任意维度的数组作为参数,并根据数组的维度执行不同的操作(例如一维数组执行求和操作,二维数组执行求行列式操作等,具体操作可自行定义)。请详细说明设计思路,并给出完整的代码实现。
28.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 模板递归:通过模板特化来区分不同维度的数组。利用递归模板实例化,直到数组维度为0时终止递归。
  2. 类型萃取:使用std::enable_ifstd::is_array来检查参数是否为数组,并根据维度进行不同的操作。

代码实现

#include <iostream>
#include <type_traits>
#include <vector>

// 辅助函数,获取数组维度
template <typename T>
constexpr int get_dimension() {
    return 0;
}

template <typename T, std::size_t N>
constexpr int get_dimension(T (&)[N]) {
    return 1 + get_dimension<T>();
}

// 一维数组求和
template <typename T, std::size_t N>
T sum(const T (&arr)[N]) {
    T result = 0;
    for (std::size_t i = 0; i < N; ++i) {
        result += arr[i];
    }
    return result;
}

// 二维数组求行列式(简单示例,仅支持2x2矩阵)
template <typename T>
T determinant(const std::vector<std::vector<T>>& matrix) {
    return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}

// 通用函数模板,根据维度执行操作
template <typename T, int dim, typename = std::enable_if_t<dim == 1>>
auto operate(const T& arr) {
    return sum(arr);
}

template <typename T, int dim, typename = std::enable_if_t<dim == 2>>
auto operate(const std::vector<std::vector<T>>& arr) {
    return determinant(arr);
}

// 更高维度的操作可继续添加模板特化

int main() {
    int oneDimArray[] = {1, 2, 3, 4};
    std::cout << "Sum of one - dimensional array: " << operate(oneDimArray) << std::endl;

    std::vector<std::vector<int>> twoDimArray = {
        {1, 2},
        {3, 4}
    };
    std::cout << "Determinant of two - dimensional array: " << operate(twoDimArray) << std::endl;

    return 0;
}