在c言语中如何成功函数模板 (在c语言中怎么表示)

在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++新规范中的可变模板,可以用以下方法:

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读