C++ template 模板笔记记录
模板实例化:模板的定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进行编译,这一过程称为模板实例化
一、 函数模板
1.定义:就是把处理不同类型的公共逻辑抽象成函数,就得到了函数模板
template<typename T>
T cmp(const T& a, const T& b)
{
return max(a,b);
}
1.为什么类成员函数模板不能是虚函数?
编译器都期望在处理类的定义的时候就能确定这个类的虚函数表的大小,如果允许有类的虚成员模板函数,那么就必须要求编译器提前知道程序中所有对该类的该虚成员模板函数的调用,而这是不可行的。
2.函数模板可以声明为inline或constexpr,将它们放在template之后,返回值之前即可。
3.函数模板可以推断实力化,但是类模板不可以,只能自己指明类型参数
二 、类模板
template <typename T>
classs Stack
{
private:
vector<T> elems
public:
void Push(const T& a)
{
elems.push_back(a);
}
void pop(){}
void top() const{}
void empty(){}
};
1.如果类内声明类外实现函数的话需要每次添加template 和类名作用域
2.类内部定义的static变量的值只会影响到同类型的变化
3.类模板的特化:因为类模板中的定义不一定适用于所有数据类型,所以针对此类型应该重新定义,即所谓类模板的特化。如果要特化一个类模板,自然要特化此类模板所有的成员函数。
特化的类上面应该加着template<>
并且特化后的类的类型应该将T换成具体的数据类型
形如:
template<>
class Stack<std::string>{};
注意:以上的代码不可以运行,我这里只是为了自己做笔记,想看结果的自己实现一下即可
参考博文: