【C++】模板函数总结!!!

来源:互联网 发布:配置windows update%0 编辑:程序博客网 时间:2024/05/01 01:27

模板函数:模板函数代表的是一个函数家族,模板函数和类型无关。在模板函数使用的时候被实例化,根据实例化参数的类型产生函数的特定类型版本。

要使用函数模板,用到的关键字是template,定义模板参数列表的形式:template<class T>,这里的class可以换成typename,T是模板形参的名称。

这里可以使用class来替换typename,但是不可以使用struct来替换,这也是class和struct不同点之一。

举个栗子:

template<typename T>T Add(T left,T right){return left+right;}
这里可以利用这个模板函数实现一个通用的加法函数,但是这个函数仅限于实现同种类型的数据相加,如果要实现一个int和char类型的加法,这个函数是实现不了的。如果要实现不同类型见得加法可以在模板函数的参数列表的位置添加一个模板形参。如:

template<typename T1,typename T2>T1 Add(T1 left,T2 right){return left+right;}
注:这里T2前面的typename关键字不可省略,同时这个typename可以使用class更换。


模板机制:

在模板函数里面模板就是一张蓝图,并没有实际的函数存在,当使用特定的类型的数据调用时候就会根据实际参数的类型来对这个模板函数进行实例化,产生适合所需类型的函数。

举个栗子:

template<typename T1,typename T2>T1 Add(T1 left,T2 right){return left+right;}void test(){int a = 10;int b = 20;cout<<Add(a,b)<<endl;char c1 = 'a';int c2 = 1;cout<<Add(c1,c2)<<endl;}
这里调用了两次Add函数,但是每次传参的类型是不一样的,所以每次在模板实例化的函数也是不一样的。

例如:


调用形式:在调用模板函数的时候分为两步,1、在实例化之前简单的进行语法检查      2、在实例化期间对模板函数的代码进行分析,查看是否是有效 调用。

在模板函数里面同样存在着名字屏蔽规则,即在模板函数外面定义一个相同名称的类型,在模板函数的里面外面定义的类型就会屏蔽,但是在模板函数外使用模板函数定义的类型就会定义失败。模板形参名称作用域仅限在模板函数的声明到模板函数的定义结束。


模板参数:

在模板函数形参列表里面可以添加类型参数,通常在需要使用到常量表达式的时候使用。




模板函数的重载: 举个栗子:

int Add(int left,int right){return left + right;}template<typename T1,typename T2>T1 Add(T1 left,T2 right){return left+right;}
注:重载的函数必须放在模板函数的前面。

当我们定义了模板函数的重载函数,那么我们在调用和重载函数相同类型的实参的时候编译器会自己优先调用重载的函数,而不会优先调用模板函数,
如果需要调用模板函数,只需要在调用的是偶在函数名称后面添加<>或者<类型名>,这样编译器就会优先去调用模板函数。


模板函数的特化:

模板函数特化的调用形式:

template<>int compare<const char *>(const char *dst,const char *src){return strcmp(dst,src);}
注:特化的声明必须和特定的模板函数相匹配。在函数调用的时候实参需要和特化的函数形参完全形同,如果不同编译器就会实例化出一个函数。
通过这么特化的模板函数,那么就可以实例化出特定的函数,这样就可以完成特定的函数功能。



原创粉丝点击