一.函数模版
1.定义:用来产生一组重组的函数,这些函数具有共同的逻辑和操作步骤,但其输入和输出的数据类型可以不一样
2.模版的语法形式
3.例子:
template<typename T>
T maximum(T value1, T value2, T value3) {T maximumValue = value1; // 假设 value1 是最大值// 判断 value2 是否大于 maximumValueif (value2 > maximumValue) {maximumValue = value2;}// 判断 value3 是否大于 maximumValueif (value3 > maximumValue) {maximumValue = value3;}return maximumValue;
} // 结束函数模板 maximum
- int,float,double等具体类型替换T
- 同一个类型参数只能替换为同一种数据类型,即value1,value2,value3为同一种数据类型
#include <iostream> // 需要包含头文件以使用cout和cinusing namespace std;// 假设maximum函数模板已经在上面定义int main() {// 演示使用整数int int1, int2, int3;cout << "Input three integer values: ";cin >> int1 >> int2 >> int3;// 调用整数版本的maximum函数cout << "The maximum integer value is: " << maximum(int1, int2, int3) << endl;// 演示使用双精度浮点数double double1, double2, double3;cout << "\nInput three double values: ";cin >> double1 >> double2 >> double3;// 调用双精度浮点数版本的maximum函数cout << "The maximum double value is: " << maximum(double1, double2, double3) << endl;// 直接使用模板参数调用maximum函数cout << "The maximum double value is: " << maximum<double>(4, 5, 3) << endl;return 0; // 结束main函数 }
// 调用整数版本的maximum函数cout << "The maximum integer value is: " << maximum(int1, int2, int3) << endl;
实参类型int替换T,创建int版本的maximum的函数,其他的以此类推
- 被同名,具有不同形参列表的函数模版重载
- 被同名,具有不同形参列表的非函数模版重载
注意:T1与T2类型不同,且为值拷贝
二.类模版
自定义类模版
template <typename T1, typename T2>
class Pair {
private:T1 first;T2 second;public:Pair(const T1& f, const T2& s) : first(f), second(s) {}T1 getFirst() const { return first; }T2 getSecond() const { return second; }
};
实例化类模版
- 实例化了一个
Pair
对象,其中T1
被实例化为int
,T2
被实例化为double
:
Pair<int, double> myPair(5, 3.14);
使用显式模版实参:
作用:使用显式模板实参列表来明确指定模板实例化时使用的模板参数,而不是让编译器根据上下文推断,这在某些情况下可能是必要的。格式:当使用显式模板实参列表时,可以在模板名称后面使用尖括号(<>)来指定模板参数。这样可以确保使用指定的模板参数进行实例化,而不依赖于编译器的模板参数推断。
#include <iostream>template <typename T> void printValue(T value) {std::cout << value << std::endl; }int main() {printValue<int>(5); // 显式指定模板参数为int// printValue(5); //不显式指定模版参数,编译器会推断模板参数为intprintValue<double>(3.14); // 显式指定模板参数为doubleprintValue(3.14); // 不显式指定模版参数,编译器会推断模板参数为doublereturn 0; }
<int>
和<double>
就是显式模板实参列表,它们明确指定了在调用printValue
函数时应该使用的模板参数类型。
(这是类模版接口与实现未分离的情况,未来会补充接口与实现分离的情况)
三.例题
【程序题】
编写一个程序,它利用名为minimum的函数模板来确定两个参数中的较小值。分别用整型、字符型和浮点型的实参测试该程序。
输入:
10 5s g12.5 99.8
输出:
The smaller integer value is:5The smaller character value is:gThe smaller double value is:12.5
代码:
定义与实现放在了一起
#include<iostream>
#include<cstring>
using namespace std;
template<typename T>
T minimum(const T& a, const T& b)
{if (a > b){return b;}elsereturn a;
}int main()
{int a=0, b=0;cin >> a >> b;char ch1='\0', ch2 = '\0';cin >> ch1 >> ch2;double c=0, d=0;cin >> c >> d;cout << "The smaller integer value is:" << minimum(a, b)<< endl;cout << "The smaller character value is:" << minimum(ch1, ch2)<< endl;cout << "The smaller double value is:" << minimum(c, d) << endl;return 0;
}
注意:
- 模板函数声明中的
T minimum<const T& a, const T& b>;
是错误的。正确的声明应该是template<typename T> T minimum(const T& a, const T& b);
。char ch1 = NULL, ch2 = NULL;
是错误的。字符变量应该使用单引号,例如char ch1 = '\0', ch2 = '\0';
。
cout方面
应该是
cout << "The smaller integer value is:" << minimum(a, b)<< endl;cout << "The smaller character value is:" << minimum(ch1, ch2)<< endl;cout << "The smaller double value is:" << minimum(c, d) << endl;
而不是
cout << "The smaller integer value is:minimum(a,b)" << endl;cout << "The smaller character value is:minimum(ch1,ch2)" << endl;cout << "The smaller double value is:minimum(c,d)" << endl;
在
cout
语句中,你不能直接将函数调用minimum(a,b)
嵌入到字符串中,因为C++不会识别这种语法。