C++模板小结

C++中突出的特性之一就是代码重用,而模板在其中发挥了重要的作用,STL也是依托于C++模板而实现的最为广泛和有用的工具库。模板所涉及到的知识比较杂,简单总结如下,以便日后温习。

1.基本使用

模板使用关键字template定义,可以使用class或者typename来声明模板类型的类型名称,同时模板可以嵌套使用。例如以下的模板声明:

//引入模板类型T的class A
template 
class A 
{
    ...
};

//引入模板类型K,V以及模板类templateC的class B
template class C>
class B
{
    C key;
    C value;
    ...
}

//命名冲突
class D { ... };
int p;
template
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
int GetGlobalId()
{
   static int s_id = ++GlobalId;
   return s_id;
}

GetGlobalId();  //1
GetGlobalId();  //2
GetGlobalId(); //3
...
std::cout<<"char:"<()<()<()<

从上面的程序可以看出,模板函数在参数指定的时候,会生成对应的结构体,在编译时期完成实例化(并且对应的类型只会生成一次)。

2.模板特化与偏特化

特化和偏特化的含义都很简单。特化是指对于模板中的模板类型为指定类型时采取区别的定义(实现)方式;偏特化是指对于指定部分模板类型的情况下,对于整个模板采用区别的定义(实现)方式,参考如下代码:

template
void fun1(T t)
{   ...   }

//为模板类型T为char指定特化
template<>
void fun1(char t)
{   ...   }

template
void fun2(A a, B b)
{   ...   }

//为模板类型B为char指定偏特化
template
void fun2(A a, char b)
{   ...   }

note:模板类声明所有部分必选全部包含在头文件中,或者使用.h include .hpp的方式。

你可能感兴趣的:(C++模板小结)