如何为带长度模板参数的自定义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
相关产品推荐
相关产品推荐

