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

如何为带长度模板参数的自定义Array类实现通用求和函数

问题原因

你定义的Array模板包含两个模板参数:类型参数T、非类型参数L(表示数组长度),使用时必须同时传入两个参数才算完整的类型,因此只写Array<int>会因为缺少第二个参数编译失败。

解决方案

将求和函数也定义为模板函数,把数组长度作为非类型模板参数,由编译器自动从传入的Array实例推导参数即可,无需手动指定长度。

第一步:完善Array类的访问接口

你当前的m_buff是类私有成员,外部函数无法直接访问,需要先补充元素访问和长度获取接口:

template <typename T, unsigned L>
class Array
{
    T m_buff[L];
public:
    // 重载[]运算符访问元素
    T& operator[](unsigned idx) { return m_buff[idx]; }
    const T& operator[](unsigned idx) const { return m_buff[idx]; }
    // 获取数组长度
    static constexpr unsigned size() { return L; }
};

第二步:实现适配任意长度的求和模板函数

通用版本(兼容所有C++标准)

如果仅需要处理元素为int的Array:

template <unsigned L>
int sum(Array<int, L> a)
{
    int total = 0;
    for (unsigned i = 0; i < L; i++) {
        total += a[i];
    }
    return total;
}

如果需要适配任意数值类型的Array,可以再增加类型模板参数:

template <typename T, unsigned L>
T sum(Array<T, L> a)
{
    T total = T(); // 零初始化
    for (unsigned i = 0; i < L; i++) {
        total += a[i];
    }
    return total;
}

C++17及以上简化版本(折叠表达式)

无需手写循环,代码更简洁:

#include <utility>

template <typename T, unsigned L>
T sum(Array<T, L> a)
{
    return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
        return (a[Is] + ... + T());
    }(std::make_index_sequence<L>{});
}

使用示例

调用时无需手动指定模板参数,编译器会自动推导长度,适配任意长度的Array实例:

Array<int, 3> arr3;
// 给arr3元素赋值...
int sum3 = sum(arr3); // 自动推导长度为3

Array<int, 10> arr10;
// 给arr10元素赋值...
int sum10 = sum(arr10); // 自动适配长度为10

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:06:03