使用函数模板 实现一个函数就可以起到上面三个函数才能起到的作用
当数据类型是int时,编译器生成一个函数,其形参类型都是int
当数据类型时double时,编译器生成一个函数,其形参类型都是double
在写入template<typename T>这句代码时可以生成多个参数
其函数模板的格式是template<typename T1, typename T2>
编译通过实参的类型,推出函数中的数据类型,生成对应的函数,这个过程叫模板实例化
下面两个函数模板中的函数名称可以相同
自定义类型的函数名也可以和函数模板的名称相同
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
return left + right;
}
int Add(const int& left, const int& right)
{
return left + right;
}
//类模板
template<class T>
class Stack
{
public:
void Push(const T& x)
{}
private:
T* _a;
int _top;
int _capacity;
};
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.111, d2 = 20.111;
//1. 如果调用的是具有模板的函数,编译器将会根据传入的数据去推演形参的类型
//2. 如果像下面这种方式进行函数调用,可以称之为显示实例化
// 那么编译器会直接将形参理解为<>中的数据类型
cout << Add<double>(a1, a2) << endl;
cout << Add<int>(d1, d2) << endl;
// 下面第一行代码会调用模板T1 Add(T1 left, T2 right)
// 第二行代码会调用int Add(const int& left, const int& right)
// (如果模板和int Add(const int& left, const int& right)同时存在,
// 由于调用int Add(const int& left, const int& right)需要类型转换
// 所以会实例化模板
// 第三行会直接通过显示实例化调用模板
// 总结:显示实例化 > 参数类型匹配的自定义函数 > 模板 > 参数不匹配需要强转的自定义函数
cout << Add(a1, a2) << endl;
cout << Add(d1, d2) << endl;
cout << Add<double>(a1, a2) << endl;
//使用类模板,生成两个不同的栈类,不同之处在于存放的数据类型不同
Stack<int> st1;
Stack<double> st2;
return 0;
}
10 C++中使用模板类的原因
10.1 模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构
10.2 模板最重要的一点就是类型无关,提高了代码复用性
10.3 只要支持模板语法,模板的代码就是可移植的
注意:模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换
13 模板声明的几种方式
13.1 template<class T1,class T2>
13.2template<typename T1,typename T2>
13.3template<class T1,typename T2>