C++模板
模板编程是 STL 的基石,也是 c++11 的核心特性之一。模板是相对于编译器而言,顾名思义就是向编译器提供一个处理事务的模板,以后需要处理的东西,如果都是这个事务类型,那么统统用这个模板处理。
基本语法
基本语法如下:
template <typename T1> T
template告诉编译器,接下来为一个模板。一旦模板被实例化,T就会变成一个具体的类型。
template <typename T>
T add(T a, T b)
{
T c;
c = a+b;
return c;
}
#接下来我们就可以使用add(1,2),add(2.1,3.3)这样的函数。
所有模板在开始都需要* template* 这个关键词,模板参数个数可以任意改变。
类模板
C++11不仅支持函数的模板,同样支持类的模板。
template <typename T>
Class Myclass
{
T var;
public:
T ass;
T add(const T a, const T b);
};
template <typename T>
T Myclass<T>::add(T a, T b){
T c;
c = a+b;
return c;
}
Myclass<int> A
用int实例化一个类A。
Myclass<double> B
用double实例化一个类B。
成员模板
模板的使用范围是广泛的,不仅可以用作函数模板,类模板,还可以用作 class ,struct ,template class 的成员
template <class T>
class Myclass
{
public:
T a;
template <typename type_1 , typename type_2>
type_1 add(const type_1 lva
,const type_2 rva);
};
template <class T>
template <typename type_1,typename type_2>
type_1 Myclass<T>::add(const type_1 lva, const type_2 rva)
{
a = lva + rva;
return a;
}
在类的声明中使用了一个嵌套的模板声明。且通过作用域运算符 :: 指出 add 是类的成员。
模板如此强大,甚至允许我们在模板类中再建立模板类:
template <class T>
class Myclass
{
public:
T a;
template <typename type_1 , typename type_2>
type_1 add(const type_1 lva ,const type_2 rva);
template <class type_3>
class Myclass_2; // 声明放在这里,具体定义放在类外进行。
Myclass_2<T> C; // 定义一个Myclass_2 类 A。使用 T 进行实例化
};
template <class T>
template <typename type_1,typename type_2>
type_1 Myclass<T>::add(const type_1 lva, const type_2 rva)
{
a = lva + rva;
return a;
}
template <class T>
template <class type_3>
class Myclass<T>::Myclass_2
{
public:
type_3 value;
type_3 sub(const type_3 a , const type_3 b) {vlaue = a - b;}
};
模板中的静态成员
在类中定义的静态成员是存储在静态区中,被所有类对象共享,并不属于某一个类所有,同样的在模板类中的静态成员也不会被复制多份,而是被同类实例化的类对象共享,比如所有 int 和所有 double 的类对象,享有相互独立的静态变量。也可以说是编译器生成了 int 和 double 两个版本的类定义。
typename与class
typename和class是模板中经常使用的两个关键词 ,在模板定义的时候没有什么区别。以前用的是 class,后来 c++ 委员会加入了 typename。