C++中突出的特性之一就是代码重用,而模板在其中发挥了重要的作用,STL也是依托于C++模板而实现的最为广泛和有用的工具库。模板所涉及到的知识比较杂,简单总结如下,以便日后温习。
1.基本使用
模板使用关键字template定义,可以使用class或者typename来声明模板类型的类型名称,同时模板可以嵌套使用。例如以下的模板声明:
//引入模板类型T的class A
template <class T>
class A
{
...
};
//引入模板类型K,V以及模板类template<typename >C的class B
template<typename K, typename V, template<typename > class C>
class B
{
C<K> key;
C<V> value;
...
}
//命名冲突
class D { ... };
int p;
template<class D, int p>
void fun(D d)
{
D d1 = p; //j局部的class D与int p
::D d2 = ::p; //全局空间的class D与int p
}
引用C++ Primer Plus中的话,
知道这些模板不是类和函数定义至关重要。它们是C++编译器指令,说明了如何生成类和成员函数的定义。
通过以下代码说明这句话的含义:
int GlobalId = 0;
template<class T>
int GetGlobalId()
{
static int s_id = ++GlobalId;
return s_id;
}
GetGlobalId<int>(); //1
GetGlobalId<double>(); //2
GetGlobalId<char>(); //3
...
std::cout<<"char:"<<GetGlobalId<char>()<<std::endl;
std::cout<<"double:"<<GetGlobalId<double>()<<std::endl;
std::cout<<"int:"<<GetGlobalId<int>()<<std::endl;
...
//output:
3
2
1
从上面的程序可以看出,模板函数在参数指定的时候,会生成对应的结构体,在编译时期完成实例化(并且对应的类型只会生成一次)。
2.模板特化与偏特化
特化和偏特化的含义都很简单。特化是指对于模板中的模板类型为指定类型时采取区别的定义(实现)方式;偏特化是指对于指定部分模板类型的情况下,对于整个模板采用区别的定义(实现)方式,参考如下代码:
template<class T>
void fun1(T t)
{ ... }
//为模板类型T为char指定特化
template<>
void fun1(char t)
{ ... }
template<class A, class B>
void fun2(A a, B b)
{ ... }
//为模板类型B为char指定偏特化
template<class A>
void fun2(A a, char b)
{ ... }
note:模板类声明所有部分必选全部包含在头文件中,或者使用.h include .hpp的方式。