1 模板介绍
- 模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者公式。
2 函数模板
2.1 函数模板的实现
template <类型形参表>
类型 函数名(形参表){
函数体
}
- 类型形参表的形式为:template T1, tempplate T2, …, template Tn或者class T1,class T2,…,class Tn
- 测试代码
#include
template
T myAddFunc(T data1, T data2) {
return data1 + data2;
}
int main() {
int iSum = myAddFunc(100, 50);
float fSum = myAddFunc(3.6, 8.8);
std::cout << "iSum = " << iSum << std::endl;
std::cout << "fSum = " << fSum << std::endl;
return 0;
}
iSum = 150
fSum = 12.4
2.2 函数模板实现原理
- 当我们调用一个函数模板时,编译器通常用函数实参来为我们推断模板实参。即当我们调用myAddFunc时,编译器使用实参的类型来确定绑定到模板参数T的类型。
- 例如我们调用myAddFunc(100, 50)时,实参类型为int,编译器会推断出模板实参为int,并将它绑定到模板参数T
- 编译器用推断出的模板参数来为我们实例化一个特定版本的函数。
2.3 函数模板重载
#include
template
T myAddFunc(T data1, T data2) {
return data1 + data2;
}
template
T myAddFunc(T data1, T data2, T data3) {
return data1 + data2 + data3;
}
int main() {
int sum1 = myAddFunc(10, 20);
int sum2 = myAddFunc(10, 20, 30);
std::cout << "sum1 = " << sum1 << std::endl;
std::cout << "sum2 = " << sum2 << std::endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 类模板实际上是函数模板的推广。类模板用于实现所需数据的类型参数化
3.1 类模板的声明与定义
template <类型形参表>
class 类名{
//类成员
};
template <类型形参表>
返回类型 类型<类型名>::成员函数1(形参表){
//函数体
}
template <类型形参表>
返回类型 类型<类型名>::成员函数n(形参表){
//函数体
}
template
class MyArray
{
public:
MyArray(int size);
~MyArray();
T& get(int index);
void set(int index, T value);
private:
int mSize;
T *mData;
};
template
void MyArray::set(int index, T value) {
mData[index] = value;
}
template
MyArray::MyArray(int size)
{
mSize = (size > 1) ? size : 1;
mData = new T[mSize];
}
template
MyArray::~MyArray()
{
delete[]mData;
}
template
T& MyArray::get(int index) {
return mData[index];
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 这里要注意下,类模板的定义和实现都要放在头文件中。
- 调用
#include
#include "MyArray.h"
int main() {
MyArray intArray(10);
intArray.set(0, 12);
intArray.set(1, 24);
intArray.set(2, 34);
intArray.set(3, 55);
std::cout << "intArray[0] = " << intArray.get(0) << std::endl;
std::cout << "intArray[1] = " << intArray.get(1) << std::endl;
std::cout << "intArray[2] = " << intArray.get(2) << std::endl;
std::cout << "intArray[3] = " << intArray.get(3) << std::endl;
MyArray floatArray(10);
floatArray.set(0, 1.1);
floatArray.set(1, 19.5);
floatArray.set(2, 20.0);
floatArray.set(3, 8.8);
std::cout << "floatArray[0] = " << floatArray.get(0) << std::endl;
std::cout << "floatArray[1] = " << floatArray.get(1) << std::endl;
std::cout << "floatArray[2] = " << floatArray.get(2) << std::endl;
std::cout << "floatArray[3] = " << floatArray.get(3) << std::endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29