在c言语中如何成功函数模板 (在c语言中怎么表示)
本文目录导航:
在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++中的可变参数模板提供了一种弱小的灵敏性,准许函数和类接受恣意数量的参数。
这种模板的关键在于参数包(parameter pack)的经常使用,它经过不凡语法将多个参数打包,如cpptemplate class MyClass {MyClass(Args... args) { /* 解决恣意数量的参数 */ }};类`MyClass`可以接受恣意数量的类型,照实例化时:`MyClass myObject;`当然,也可以设置固定参数限度,如要求至少一个参数:cpptemplatevoid myFunction(T t, Args... args) {//...}关于函数模板,雷同支持援用和常量类型,如cpptemplatevoid myFunctionRef(Args&... args) {//...}和cpptemplatevoid myConstFunction(const Args&... args) {//...}测量参数数量理论经常使用`sizeof`,但这里用于计算参数包的大小,而非字节大小,如`std::tuple_size::value`实践运行中,可变参数模板经过递归解决不同数量的函数申明,这与传统递归不同,它依赖于每次递减参数的函数签名,确保每个调用都是唯一无二的。
雷同须要一个中断条件,不过这里的中断条件是参数数量的缩小,而非函数的详细行为。
c++ 怎样失掉函数的参数个数
应用c++新规范中的可变模板,可以用以下方法: