模板于数组应用之间的注意点

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。
您可以使用模板来定义函数和类。
接下来我们来看看模板应用于数组上的一些注意点。主要通过两个例子来看一下这些注意点。
首先第一个例子:

template <class T> void print_array(T& array){
    int length = sizeof(array) / sizeof(array[0]);
    for(int i = 0; i < length; i++){
        cout << array[i] << " ";
    }
    cout << endl;
}

注意到,这里的array一定需要以引用的方式传递。因为在中间代码中,我们需要求取下数组的长度。而我们知道,sizeof(array)能够求得整个数组所占的字节数。但是如果我们直接将数组名传入函数中,则该数组名退化为指针。此时如果再用 sizeof(array)来求取数组所占字节数将得到错误的答案。因为此时array已经退化为指针。那么sizeof(array)讲求得该数组元素类型的指针所占的字节数。因此,此处我们必须应用引用传递。

接下来我们来看第二个例子:

template <class T> T& set_val(T array[], int i){
    return array[i];
}

这个模板的目的是接受一个array,并能根据一个整型的 i 作为索引,返回该数组的第 i 个元素的引用。这样我们就可以运用这个函数给给定索引的数组元素进行赋值。那么这里要注意的是我们的数组不能再像上面的例子传入数组名的引用。因为我们最终是要return数组元素的引用。所以返回类型是数组元素类型的引用。如果此时参数为传入数组名的引用,则模板根据传入参数的类型进行判断我们的 T 的类型。此时为数组名的类型。这样我们的返回类型就变成了数组名的类型的引用。而这个一般都不是我们数组元素类型的引用。因为一般情况下,我们的数组元素类型和数组名的类型是不一样的。因此,在这种情况下,一定要传入数组参数,即 class_type array[] 的形式。

下面是一个测试用例,以及相应的运算结果:

int val[] = {1, 2, 3, 4, 5, 6};
print_array(val);
for(int i = 0; i < 6; i++){
    set_val(val, i) = i + 100;
}
print_array(val);

结果:

1 2 3 4 5 6 
100 101 102 103 104 105
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容