C++11中传递std::array引用时如何避免指定数组大小?
如何在传递std::array引用的函数中避免指定数组大小?
嗨,我完全懂你的烦恼——每次在main里创建不同大小的std::array,就得手动修改passbyref函数里的数组大小参数,实在太繁琐了!其实用模板函数就能完美解决这个问题,让函数自动适配任意大小的std::array。
先看看你遇到问题的场景代码(补全了passbyref的示例):
#include<iostream> #include<string> #include<iomanip> #include<array> using namespace std; class GradeBook { public: // 这里必须指定固定大小,换数组大小就得改代码 void passbyref(array<int, 5>& arr) { arr[0] = 100; } void changevalues() { array<int, 3> arr2 = {1,2,3}; cout<<arr2[2]<<endl; arr2[2]=2; cout<<arr2[2]<<endl; } }; int main() { GradeBook gb; array<int, 5> arr1 = {1,2,3,4,5}; gb.passbyref(arr1); // 没问题 array<int, 3> arr3 = {6,7,8}; // gb.passbyref(arr3); // 这里直接报错,因为函数只接受size=5的array return 0; }
解决方案:模板成员函数
把passbyref改成模板函数,将数组的大小作为模板参数,编译器会自动推导这个参数的值,不用你手动指定:
#include<iostream> #include<string> #include<iomanip> #include<array> using namespace std; class GradeBook { public: // 模板函数,自动推导数组大小N template<size_t N> void passbyref(array<int, N>& arr) { // 示例操作:遍历修改数组元素 for (auto& num : arr) { num *= 2; // 每个元素乘2 } } void changevalues() { array<int, 3> arr2 = {1,2,3}; cout<<arr2[2]<<endl; arr2[2]=2; cout<<arr2[2]<<endl; } }; int main() { GradeBook gb; array<int, 5> arr1 = {1,2,3,4,5}; gb.passbyref(arr1); // 自动推导N=5 for (int num : arr1) { cout << num << " "; // 输出:2 4 6 8 10 } cout << endl; array<int, 3> arr3 = {6,7,8}; gb.passbyref(arr3); // 自动推导N=3 for (int num : arr3) { cout << num << " "; // 输出:12 14 16 } cout << endl; gb.changevalues(); return 0; }
进阶:支持任意类型的std::array
如果想让函数不仅适配不同大小,还支持不同元素类型(比如double、string),可以把元素类型也作为模板参数:
template<typename T, size_t N> void passbyref(array<T, N>& arr) { // 示例操作:给每个元素加1(只要T类型支持+=操作) for (auto& elem : arr) { elem += 1; } }
这样不管你传array<double, 4>还是array<string, 2>,函数都能正常工作啦!
内容的提问来源于stack exchange,提问作者Shabbar
相关产品推荐
相关产品推荐

