如何编写适配多种类数组类型的通用AddOne函数避免代码重复?
用C++模板函数解决类数组类型的通用适配问题
当然可以!这种重复实现完全没必要——C++的模板函数就是专门解决这类「逻辑相同、适配多种类型」的场景的,写一次代码就能搞定所有符合要求的类数组类型。
核心思路
模板函数允许我们编写不依赖具体类型的通用代码,编译器会根据传入的实际参数类型,自动生成对应的函数实例。只要你的目标类型支持下标运算符[](对于容器类最好还支持size()方法,或者能被范围for循环遍历),就能直接适配。
实现代码
我们可以写两个模板版本,分别适配带size()方法的容器(比如std::vector、std::array)和C数组:
// 适配std::vector、std::array等容器的版本 template <typename Container> void AddOne(Container& container) { // 用范围for循环更简洁,不需要手动处理索引和size for (auto& elem : container) { elem += 1; } } // 专门适配C数组的版本(编译器会自动推导数组元素类型和大小) template <typename T, size_t N> void AddOne(T (&array)[N]) { for (auto& elem : array) { elem += 1; } }
使用示例
不管是哪种类数组类型,调用方式完全一致:
#include <vector> #include <array> #include <iostream> int main() { // 测试std::vector<double> std::vector<double> vec = {1.0, 2.0, 3.0}; AddOne(vec); for (auto num : vec) std::cout << num << " "; // 输出:2 3 4 // 测试std::array<double, 3> std::array<double, 3> arr = {4.0, 5.0, 6.0}; AddOne(arr); for (auto num : arr) std::cout << num << " "; // 输出:5 6 7 // 测试C数组 double c_arr[] = {7.0, 8.0, 9.0}; AddOne(c_arr); for (auto num : c_arr) std::cout << num << " "; // 输出:8 9 10 return 0; }
为什么这能工作?
- 第一个模板函数:只要传入的类型是可迭代的(支持范围for循环),并且元素可以被
+=1操作,就能正常运行——std::vector和std::array都满足这个要求。 - 第二个模板函数:利用C++的模板参数推导特性,编译器会自动获取C数组的元素类型
T和大小N,不需要手动传入size参数,使用起来和容器版本一样方便。
如果你不想写两个版本,也可以用更通用的方式(比如结合std::begin和std::end),但上面的写法更直观,也更容易理解。
内容的提问来源于stack exchange,提问作者Hayashi Yoshiaki
相关产品推荐
相关产品推荐

