函数模板
-
模板:
-
模板推演:推演模板的具体类型
-
模板实例化:实例化生成具体的函数
-
-
函数模板是在编译之前做推演实例化,生成对应的函数,将模板中的参数替换掉
-
auto不能做参数和返回值,定义调用的变量的时候使用
函数模板并没有少写代码,而是交给编译器使用,让其做推演实例化
用法上可以认为内置类型有构造函数,跟自定义类型一样使用
隐式类型转换:c++沿袭c语言搞了个相近类型
相近类型:表达的意义差不多,例如int ,char double,意义都是表示数据大小
or
显示实例化调用
template <class T>
void Add(const T & x1, const T& x2)
{
return x1 + x2;
}
int main()
{
int a = 1, b = 4;
double c = 2.2, d = 4.3;
Add(a, b);
Add(c,d);
Add(a, c);
return 0;
}
//
int main()
{
int a = 1, b = 4;
double c = 2.2, d = 4.3;
cout << Add(a, b) << endl;
cout << Add(c,d) << endl;
cout << Add(a, (int)c) << endl;
cout << Add((double)a,c) << endl;
//显示实例化指定的类型
cout << Add<int>(a, c) << endl;
cout << Add<double>(a, c) << endl;
return 0;
}
显示实例化调用结果
模板原则:有现成完全匹配的就直接调用,没有就实例化模板生成
有需要转换匹配的,他会优先选择去实例化模板生成
匹配原则:完全匹配>模板>转换匹配调用
模板函数不允许自动转换,只能去自己强制转换
类模板
类模板的使用都是显示实例化指定的类型
模板参数不同就不是一个类
template <class T>
class Stack
{
public:
Stack(int capacity == 4)
:_a(new T[capacity])
, _top(0)
, _capacity(capacity)
{
}
~Satck()
{
delete [] _a;
_a = nullptr;
_top = _capacity = 0;
}
//类中申明,类外定义
void push(const T & x)
private :
T* _a;
int _top;
int _capacity;
};
//普通类,类名就是类型
//类模板,类名不是类型,类型是Stack<T>
//在两个文件的情况下,模板不支持把申明放到.h,定义放到.cpp文件,使用时会出现链接错误
template<class T>
void Stack<T>::push(const T & x)
{
//在类外面定义,指定类域+类模板显示实例化
}
int main()
{
//类模板的使用都是显示实例化
Stack <double> st1;
Stack <int> st2;
//尽管这里都是栈,用一个模板去实例化生成的,但是模板的参数不同就不是一个的类
return 0;
}
模板不支持在不同的文件中声明和定义分离【会报链接错误】(实例化对象)
Stack st1; Stack st2;
//尽管这里都是栈,用一个模板去实例化生成的,但是模板的参数不同就不是一个的类 return 0; }
> 模板不支持在不同的文件中声明和定义分离【会报链接错误】(实例化对象)