C++函数模板

本文详细介绍了函数模板的概念,包括其语法格式、如何实例化以及在不同数据类型下的应用。通过具体的代码示例,展示了如何创建通用的函数模板以适应多种数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

》函数模板

       函数模板是一系列相关函数的模型或样板,这些函数的源代码形式相同,只是所针对的数据类型不同。对于函数模板,数据类型本身成了它的参数,因而是一种参数化类型的函数。声明一个函数模板的格式是:

               template<<模板形参表>><函数声明>

       其中的<模板形参表>由一个或多个<模板形参>组成,多个<模板形参>之间用逗号隔开。每个<模板形参>具有下面几种形式:

              #   typename <参数名>

              #   class <参数名>

              #   <类型修饰> <参数名>

        这里的<参数名>可以是任意的标识符。在这三种形式中,前两种是等价的:在声明模板参数时,关键字typename与class可以互换。用typename或class声明的参数称为虚拟类型参数;而用<类型修饰>声明的参数则称为常规参数,在形式上与普通的函数参数声明相同。

        <函数声明>与一般函数的声明类似,只是某些类型修饰符被虚拟类型参数所替代。

        示 例:

          template <class T>

          void addto(T a[],T b[],int size){

                  for(int i=0;i<size;i++)  b[i]+=a[i];

           }

         其中用<>括起来的部分就是模板形参表,T是一个虚拟类型参数。

         定义好函数模板后,编译系统将依据每一次对函数模板调用时实际所使用的数据类型生成适当的调用代码,并生成相应的函数版本。编译系统生成函数模板的某个具体函数版本的过程称为函数模板的实例化(instantiation),每一个实例就是一个函数定义。在实例化过程中,用实参的实际类型(如int、long等)替代虚拟类型(如T)。

         示 例:编译系统在处理

         long double x[]={1,2,3,4,5},y[]={6,7,8,9,10};

         addto(x,y,5);

         这两个语句时,会生成如下的函数实例:

         void addto(long double a[],long double b[],int size){

                  for(int i=0;i<size;i++) b[i]+=a[i];

         }

        而在处理

        unsigned x[]={1,2,3,4,5,6,7,8,9},y[]={22,33,44,55,66,77,88,99,11};

        addto(x,y,9);

        这两个语句时,会生成:

        void addto(unsigned a[],unsigned b[],int size){

                 for(int i=0;i<size;i++) b[i]+=a[i];

        }

        实例化的过程或结果通常是看不见的,编译系统会根据函数调用的具体情况自动传递相应的模板实参,生成相应的函数实例。

        函数模板的模板形参表中可以有多个参数。例:addto模板也可以定义如下:

        template <typename T1,typename T2>

        void addto(T1 a[],T2 b[],int size){

                for(int i=o;i<size;i++) b[i]+=a[i];

        }

        这个模板允许两个数组可以有不同的类型,例如一个int一个double。

        在前面的addto例子中,对模板函数的调用只使用了函数实参,省略了模板实参。但模板实参的省略并不是必然的,而是有条件的。

        在调用一个模板函数时,编译系统需要足够的信息来判别每个虚拟类型参数所对应的实际类型,可以从两个不同的渠道获得这样的信息:从模板实参表(用<>括起来的参数表) 或从模板函数实参表(用()括起来的参数表),模板实参的信息优先于函数实参的信息。 如果后者获得的信息已经能够判定其中部分或全部虚拟类型参数所对应的实际参数,而且它们又正好是参数表中最后的若干参数,则模板实参表中的那几个参数可以省略。如果模板实参表中的实参都被省略了,则连空表<>也可以不要。因此,若x和y都是unsigned型,则addto<unsigned>(x,y,9)    addto<>(x,y,9)    addto(x,y,9)三者是等价的。反之,对于某个模板实参,如果从模板函数的实参表中无法获得同样的信息,就不能省略;或者虽然能够获得同样的信息,但在它后面还有其他不能省略的实参,则其自身还是不能省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值