泛型编程是在编译时将类型确定,而OOP是在程序运行之前都不知道类型。
有两种模板变量。
方式都是在函数前增加$template\ <模板参数列表>$。
类型参数。用typename来声明。template <typename name1,typename name2,…>
非类型参数。就是一个在模板中使用的常量。类型只能是整型或者引用或指针。定义与普通定义一样,除了在template中。
需要在调用函数的时候可以通过输入数据能够推断出模板参数或者直接显式声明模板参数。
template<unsigned N,unsigned M>
int compare(const char (&p1)[N],const char (&p2)[M]){}
inline和constexpr都是在template后的。
由于模板函数只有在调用的时候才会生成实例,而此时编译器必须知道函数的定义是什么,因此一般模板类的声明和定义放在一起。
不像函数模板可以推断,必须显式声明。
类的每一个实例会生成一个独立的类。
但是只有当类型不同时才是不同的类,如果是相同的,会发现静态变量是通用的。
而对于成员函数,若是声明在外部,则由于其也有各自对应类型版本,因此前要加template,并且,由于已经是类的一个成员函数,而不同类型版本的类是不同的,因此也要指定类的版本,也就是class<T>.
但即便类模板已经被实例化了,其成员函数也只会在被使用时才会被实例化。
当在类模板中使用自身类型时,就无需再指定版本,也就是模板实参,也就是不用加<T>。
而当且仅当类名出现后,才进入了类模板的作用域,因此,返回类型必须提供类型实参。