可变参数模板 (c++可变参数模板)
本文目录导航:
可变参数模板
在编程中,咱们经常要求编写模板以成功复用代码,而普通模板只能经常使用固定数量的参数。
可变参数模板则提供了接纳恣意数量参数的才干,极大地增强了代码的灵敏性。
定义一个可变参数类模板时,咱们可以在模板参数列表中引入一个模板参数包,准许该包接纳零个或多个参数。
这样,咱们就可以编写出能够处置恣意参数数量的函数或类。
实例化时,关于类模板,可变模板参数包必定是最后一个参数。
而在函数模板中,这种限度不复存在。
应用递归技巧,咱们能成功处置恣意数量参数的函数。
经常使用可变参数模板,咱们可以创立一个安保地处置不同数量参数的函数,如processValues()。
这个函数能遍历传入的可变参数列表,并对每个参数调用相应的handleValue()函数。
经过...运算符,咱们能实如今调用时将参数包倒退为单个参数。
在处置参数时,要求留意...运算符的双重含意:在参数模板列表中,它示意可变参数包;而在函数调用中,它示意参数包倒退。
确保模板中至少有一个参数,经过...倒退参数,函数能够递归地调用自身,直至参数数量降至一个。
在成功中,咱们或许面临复制传值的开支疑问,尤其是关于大型数据结构。
为处置此疑问,可以思考经常使用援用传值,或许驳回右值援用与std::forward函数,以提升功能。
最后,咱们可以应用可变参数模板成功简化版的printf函数,例如tprintf。
其上班原理与processValues()相似,但首参数固定为const char*。
经过可变参数模板,咱们不只增强了代码的灵敏性,还提高了复用性与效率,是现代编程中无法或缺的技术。
在c言语中如何成功函数模板
假设要写个函数支持多种数据类型,首先想到的就是C++的模板了,然而有时刻只能用C言语,比如在linux内核开发中,为了缩小代码量,或许是某面试官的要求…思考了一阵子后,就想到了qsort上的函数原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );快排时,只需自己成功相应数据类型的比拟函数cmpare就可以了.假设比拟int型时,一个典型的compare函数如下:
那么,就是说可以应用void *. void *意指未指定类型,也可以了解为恣意类型。
其余类型的指针可以间接赋值给void *变量,然而void *变量要求强迫类型转换为其它指针类型。
这个置信大家都知道。
那么上方以一个繁难的标题为例,来讨论如何在C言语中成功模板函数。
方法1:应用void *.在看上方的源程序之前,要求了解几点。
首先,在32位平台上,任何类型的指针所占的字节都是4个字节,由于32位机器虚构内存普通为4G,即2的32次方,只需32位即4个字节就可以足够寻址,sizeof(void *)=4;其次,只管各种不同类型的指针所占的空间都为4个字节,然而不同类型的指针所指的空间的字节数却不同(这一点尤为关键,上方的程序我在开局没有调通就由于这点看法不强)。
所以,假设你将一个指针强迫转换为另一个类型的指针,指针自身所占的字节是不变的,然而,假设对这个指针启动运算,比如 *p,p++,p-=1等普通都是不同的。
再次,函数指针应该了解下,这里不多说。
最后,由于Sandy跟我说,C++开局的时刻模板的成功其实就是应用宏交流,在编译的时刻确定类型。
所以,为了繁难,类型也用了预编译指令#define。
<span>#includestdio.h</span>
<span>#includestdlib.h</span>
<span>//typedefintT;//或许上方的也可以.</span>
<span>#defineTint</span>
//这个FindMin是Sandy写的021也写了个,差不多的就不贴进去的.
voidFindMin(constvoid*arr,intarr_size,intarrmembersize,int*index,
int(*cmp)(constvoid*,constvoid*b)){
char*p=(char*)arr;
char*tmp=p;
for(i=1;i<arr_size;i++){
if(cmp(tmp,p)>0){
p+=arrmembersize;
(*index)=((int)(tmp-arr))/arrmembersize;
可以把指针看作是char*,假设转换为int*,那上方的位移就不正确了.</span>
<span>return</span>index<span>;</span>
<span>int</span>result<span>;</span><span>//result保留的是最小值索引.</span>
result<span>=</span>FindMin<span>(</span>arr,<span>12</span>,
空幻引擎中的C++模板
模板是C++泛型编程的基础,它准许咱们创立类和函数的蓝图。
当经常使用泛型类或函数时,编译器会将这些蓝图转换成实践的类和函数,这个环节称为模板的实例化,它出当初编译环节中。
模板的头文件包含类和函数的成功,由于编译器要求在编译阶段实例化模板类和模板函数。
相比普通函数和类,类模板和函数模板在最前面参与了一个关键字和被尖括号括起来的模板参数列表。
模板参数有四种类型:类型模板参数、非类型模板参数、模板模板参数和可变模板参数。
非类型模板参数示意在编译或链接时确定的常量,如指定大小。
模板类型模板参数的申明相似于模板,示意模板参数的类型是一个类模板。
可变模板参数比拟复杂,将在后续文章中独自引见。
特例化是类型婚配的环节,在实例化环节中,编译器会优先尝试婚配模板参数最相符的特例化版本。
特例化的函数/类是模板函数/模板类的一个实例化,关于某些特定类型指定不凡成功。
特例化有两种:全特例化和局部特例化,其中,函数模板只支持全特化,类模板支持全特化和局部特化。
类模板的全特例化提供了确定的模板实参,空幻引擎中的[公式] 就是经过全特例化成功的判别类型能否为整型。
类模板的局部特例化可以只提供局部模板参数的模板实参,要求进一步实例化。
空幻引擎中的[公式] 就是经过局部特例化成功的。
函数模板支持模板实参推断,编译器经过函数调用中的实参类型来确定模板实参。
当函数前往类型与参数列表中的任何类型都不相反时,要求为函数模板提供显式模板实参。
空幻引擎中的一些函数要求手动指定类型,如[公式] 和[公式] 函数。
函数模板的前往类型通常不能经过前往值推断模板参数,由于前往值不是函数调用的必要条件。
函数模板可以被重载,与普通函数一样,名字相反的函数必定要有不同数量或类型的参数。
关于函数模板,最好的工程通常是不要特例化函数模板,而是选用参与一个非模板函数重载。
特化版本不能重载,由于编译器会对等地思考一切主模板函数,只要在主模板函数选用成功后,才会检查特例化版本。