函数模板
函数模板并没有少写代码,而是交给编译器使用,让其做推演实例化
用法上可以认为内置类型有构造函数,跟自定义类型一样使用
隐式类型转换: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;
};
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; }
> 模板不支持在不同的文件中声明和定义分离【会报链接错误】(实例化对象)
|