c++中的模板template

c++中的模板template


本博客是在学习了<< c++ Primer Plus >> 相关模板知识后整理得到的。

函数模板

1.定义一个模板:template<typename T>,其中关键字typename可以换成class,T为自定义的类型名称。

template <typename T>  
void Swap(T &a, T &b) {  
    T temp = a;  
    a = b;  
    b = temp;  
}

2.重载一个模板(和上面一起定义的时候):

template <typename T>
void Swap(T* a, T* b) {
    T temp = *a;
    *a = *b;
    *b = temp;
}

3.对于具体的方法名,可以有三种重载版本:

  • 模板函数:如上面的Swap的定义。
  • 非模板函数:void Swap(int &a, int &b){...};
  • 显示具体化:template <> void Swap<int>(int &a, int &b){...}

其中,显示具体化中版本中的<int>是可以省略的,而且可以看出,在我写的显示具体化的方法和非模板方法的两个版本,其实实际的意思都是一样的,我也不知道它们有什么具体的区别(当然它们的优先级是不一样的)。对于以上三种重载版本的,编译器在选择调用的方法时,优先级会是:①非模板函数②显示具体化③模板函数。只有在找不到优先级高的方法才会往优先级低的方法中寻找。

4.模板实例:在代码中包含函数模板本身并不会生成函数定义,只是一个生成函数的方案,编译器使用模板为特定类型生成函数定义时,得到的是模板实例。例如上面的调用Swap(a,b)编译器就会生成一个Swap()的实例,该实例使用int,这种方法叫隐式实例化。模板不是函数定义,而使用int的模板实例才是函数定义。
5.显式实例化:直接命令编译器生成特定的实例,语法为template void Swap<int>(int, int)。该声明的意思是“使用Swap()模板生成int类型的函数定义”。
6.显示具体化:template <> void Swap<int>(int &, int &)。表明“使用专门为int类型显式定义的函数定义,而不使用类似显示实例化中使用Swap模板来生成int类型的函数定义”。
7.调用方法:在调用方法的时候会遵守上述提及过的优先级问题,在同一个优先级,编译器会选出最合适,参数最匹配的方法进行调用(具体细节不在此陈述)。当然你也可以使用显式实例化来调用你想调用的方法:

template <typename T>  
T lesser(T a, T b){  
    return a > b ? b : a;  
}  

int lesser(int a, int b){  
    cout << "int lesser(int a, int b)";  
    return a > b ? b : a;  
}

如果调用的时候使用lesser<int>(a,b),表明指定调用模板函数的版本,否则就会默认使用非模板函数的版本。

类模板


未完待续

猜你喜欢

转载自blog.csdn.net/qq_37993487/article/details/80375570