1.2 初识函数模板
函数模板是C++(www.cppentry.com)模板机制中的一种,其作用是为不同类型的数据生成操作相同或相似的函数。
1.2.1 函数模板的实现
模板以关键字template开头,其后是以一对尖括号划分的模板参数列表。模板参数列表中可以声明多个模板参数,多个参数声明之间以逗号分隔。例1.3是一个可用于在不同类型的数组中寻找最大值的函数模板。
例1.3
- template<typename T>
- T const& max_element(T const *l, unsigned sz)
- {
- T const *max_value(l);
- for (unsigned i = 1; i < sz; ++i)
- if (l[i] > *max_value) max_value = &(l[i]);
- return *max_value;
- }
例1.3是将例1.1与例1.2中的函数max_element“模板化”。也就是将两者的不同之处——参数及内部数据的类型——提取出来作为模板的参数,然后编译器根据需要将模板参数替换为具体的类型,并根据模板自动生成针对所需类型进行操作的函数模板实例,即真实的函数。
模板参数有多种类型,在例1.3中只用到其中之一,即类型模板参数(有关其他模板参数将在之后详细介绍)。
类型模板参数以关键字typename或者class标记,后接参数名。两个关键字在标记模板参数类型时完全等价,都表示参数为类型参数,本书遵从习惯都用typename标记。参数列表之后为模板的内容。例1.3中声明的是一个函数模板,其后内容便是一个函数声明。
函数模板中的函数体声明与普通函数的写法完全相同。并且,模板参数列表中所声明的类型模板参数可当做一个已知类型来使用。例1.3中函数模板的函数体与例1.1、例1.2的函数代码非常相似,不同之处在于凡是有关列表类型之处,皆由模板类型参数T代替。另外,考虑到列表元素可能为复杂自定义类型,其赋值会导致额外开销,在模板中将max_value改为指针以避免无谓赋值。