C++的函数模板和模板函数

C++ 模板函数 讲解及实现 目录模板函数:机制介绍模板函数:实现代码 模板函数:机制介绍 在很多时候,我们需要对不同的数据类型做一些操作,但是这些操作是相同的,比如求取一个数组中的最大元素,我们只需: for(int i=0; i<arr.size(); i++) if(arr[i] > max_val) max_val = arr[i]; 可是面对不同的数据类型,我们需要实现不同的函数,比如下面我们需要实现两个函数来选择int或者double数组中的最大值,非常麻烦 int array_max(vector<i 阅读详情

1.函数模板的声明和模板函数的生成

1.1函数模板的声明

函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。

函数模板的声明形式为:

template<typename 数据类型参数标识符>

<返回类型><函数名>(参数表)

{

    函数体

}

其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。例如:

template<typename T>

T fuc(T x, int y)

{

    T x;

    //……

}

如果主调函数中有以下语句:

double d;

int a;

fuc(d,a);

则系统将用实参d的数据类型double去代替函数模板中的T生成函数:

double fuc(double x,int y)

{

    double x;

    //……

}

函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型代替类型参数标识符之后,才能产生真正的函数。

关键字typename也可以使用关键字class,这时数据类型参数标识符就可以使用所有的C++数据类型。

1.2.模板函数的生成

函数模板的数据类型参数标识符实际上是一个类型形参,在使用函数模板时,要将这个形参实例化为确定的数据类型。将类型形参实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数。模板函数的生成就是将函数模板的类型形参实例化的过程。例如:

使用中应注意的几个问题:

⑴ 函数模板允许使用多个类型参数,但在template定义部分的每个形参前必须有关键字typename或class,即:

template<class 数据类型参数标识符1,…,class 数据类型参数标识符n>

<返回类型><函数名>(参数表)

{

     函数体

}

⑵ 在template语句与函数模板定义语句<返回类型>之间不允许有别的语句。如下面的声明是错误的:

template<class T>

int I;

T min(T x,T y)

{

   函数体

}

⑶ 模板函数类似于重载函数,但两者有很大区别:函数重载时,每个函数体内可以执行不同的动作,但同一个函数模板实例化后的模板函数都必须执行相同的动作。


2 函数模板的异常处理

函数模板中的模板形参可实例化为各种类型,但当实例化模板形参的各模板实参之间不完全一致时,就可能发生错误,如:

template<typename T>       

void min(T &x, T &y)

{  return (x<y)?x:y;  }

void func(int i, char j)

{

   min(i, i);

   min(j, j);

   min(i, j);

   min(j, i);

}

例子中的后两个调用是错误的,出现错误的原因是,在调用时,编译器按最先遇到的实参的类型隐含地生成一个模板函数,并用它对所有模板函数进行一致性检查,例如对语句

min(i, j);

先遇到的实参i是整型的,编译器就将模板形参解释为整型,此后出现的模板实参j不能解释为整型而产生错误,此时没有隐含的类型转换功能。解决此种异常的方法有两种:

⑴采用强制类型转换,如将语句min(i, j);改写为min(i,int( j));

⑵用非模板函数重载函数模板

方法有两种:

① 借用函数模板的函数体

此时只声明非模板函数的原型,它的函数体借用函数模板的函数体。如改写上面的例子如下:

template<typename T>       

void min(T &x, T &y)

{  return (x<y)?x:y;  }

int min(int,int);

void func(int i, char j)

{

   min(i, i);

   min(j, j);

   min(i, j);

   min(j, i);

}

执行该程序就不会出错了,因为重载函数支持数据间的隐式类型转换。

② 重新定义函数体

就像一般的重载函数一样,重新定义一个完整的非模板函数,它所带的参数可以随意。C++中,函数模板与同名的非模板函数重载时,应遵循下列调用原则:

• 寻找一个参数完全匹配的函数,若找到就调用它。若参数完全匹配的函数多于一个,则这个调用是一个错误的调用。

• 寻找一个函数模板,若找到就将其实例化生成一个匹配的模板函数并调用它。

• 若上面两条都失败,则使用函数重载的方法,通过类型转换产生参数匹配,若找到就调用它。

•若上面三条都失败,还没有找都匹配的函数,则这个调用是一个错误的调用。


转自:http://blog.csdn.net/beyondhaven/article/details/4204345

博途的HMI(触摸屏)的应用 触摸屏(HMI):用于控制PLC,可认为是小型上位机(用于控制PLC的都可认为是上位机)上位机(PC Station):将触摸屏升级为电脑----工控机(工业控制的机器)用博途编写西门子的触摸屏上位机。 阅读详情

相关推荐

C++函数模板的实参推断

在使用类模板创建对象时,程序员需要显式的指明实参(也就是具体的类型)。例如对于下面的 Point 类: template<typename T1, typename T2> class Point; 我们可以在栈上创建对象,也可以在堆上创建对象: Point<int, int> p1(10, 20); //在栈上创建对象 Point<char*, char*> *p = new Point<char*, char*>("东京180度", "北纬210度")

qq_33287871的博客 808

C++模板函数模板模板函数

1.函数模板声明模板函数的生成 1.1函数模板声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。 函数模板声明形式为: template (参数表) {     函数体 } 其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或cl

极简Qt 14万+

航天设备研制中的形态分类:电性件、正样件及其他关键形态详解

航天设备的研制是一个高度复杂且严谨的工程过程,涉及多个阶段的不同产品形态。这些形态各具特点,在研制流程中承担着不同的验证任务工程目标。本文将系统介绍航天设备研制中的主要形态,包括**电性件(EM)**、**正样件(FM)**以及**结构热控件(STM)**、**鉴定件(QM)****初样件(PFM)**等,详细解析它们的定义、用途工程意义,帮助读者全面理解航天产品从设计到飞行的全生命周期管理。

ScilogyHunter的博客 1551

C++模板函数

模板函数与类模板1.模板函数1.模板函数声明与定义2.模板函数的调用显式类型调用自动推导3.模板函数的底层实现 1.模板函数 1.模板函数声明与定义 C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 简单来说,就是我们提供一个抽象的函数,并不具体指定其中数据的类型,而是某个虚拟类型代替。只提供基本的功

weixin_45738899的博客 2万+

C++模板——(2)函数模板声明使用

C++模板——(2)函数模板声明使用

一个正在学习C/C++的博主 1773

C++提高】函数模板模板

模板就是通用的模具,它会大大提高代码的复用性。C++另一种编程思想称为泛型编程,主要利用的技术就是模板C++提供两种模板机制,分别是函数模板模板

weixin_44446626的博客 1383

C++ 函数模板模板函数

1、函数模板: reference:https://www.cnblogs.com/arxive/p/5224151.html 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。 函数模板声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 } 其中,template是 定义模板函数的关键字;tem...

qq_40977108的博客 589

C++模板总结:函数模板模板

C++中的一种编程思想称为泛型编程,主要利用的技术就是模板C++提供两种模板机制:函数模板模板 总结: 1、函数模板利用关键字template 2、使用函数模板有两种方式:自动类型推到、显示指定类型 3、模板的目的是为了提高复用性,将类型参数化 注意事项: 1、自动类型推导,必须推导出一致的数据类型T,才可以使用 2、模板必须要确定出T的数据类型,才可以使用 ...

桔子皮的博客 547

C++函数模板函数重载

前言 C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 例如 : 我们要实现多个函数用来返回两个数的最大值,要求能支持char类型、int类型、float类型变量 ,一般情况我们可能有如下方式...

疯狂的菜鸡 2619

C++模板——函数模板模板

函数模板的定义包括模板声明模板函数体。模板声明使用关键字template,后跟一个尖括号()中的模板参数列表。模板参数列表中可以包含一个或多个类型参数,通常使用typename或class关键字来声明类型参数。返回类型 函数名(参数列表)//函数体示例T tmp = x;x = y;y = tmp;class 类模板名//类内成员声明模板的定义使用定义一个简单的类模板public:cout

weixin_66905164的博客 1604

C++函数模板模板

本文是我在学习C++过程当中的心得学习笔记,在学习C++时已经有C语言的基础,因此入门知识省略了一部分。文章包含了C++的入门基础内容核心进阶内容,并附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。剩余的内容可以通过这篇文章找到。

晚安的博客 1736

C++函数模板模板

C++提供两种模板机制:函数模板模板

xiaojinger_123的博客 2021

C++ 函数模板模板

因此,为了避免在每个编译单元都定义函数模板,建议在头文件中对函数模板进行声明定义(即将函数模板声明定义都写在一个头文件中,然后在需要使用函数模板的地方加上该头文件)。

Levon123的博客 1682

C++中的函数模板模板

前言 在我们进行大型程序的编写时往往会遇到一类问题,同一个函数或类我们希望多种类型数据传入时都能完成类似或者相同的功能,但是在C语言中我们很难做到这一点因为我们往往在换了一个数据类型后就要重新写一遍函数,这样耽误我们大量的时间,那么有没有一种语法在C++中能够使让我们的代码成为一种模板,不同的数据类型传入也依然能够执行类似的功能呢? 正所谓世界是由懒人创造的,于是在C++中引入了模板这一概念,同时...

Outtch_的博客 1131

[C++]函数模板模板

本文介绍了C++函数模板模板的基本用法与原理。函数模板部分从C语言中函数重载的局限性出发,引出模板的必要性;通过SwapAdd示例展示了模板的定义、隐式实例化与显式实例化,并分析了多参数模板及重载解析规则。类模板部分以Stack类为例,说明模板类的定义方式,重点强调类模板声明与定义必须放在同一文件中,否则会导致链接错误。文章还通过type_info演示了运行时类型获取,帮助理解模板实例化机制。

SUICIDEKILL的博客 733

实用经验 92 区分函数模版模版函数,类模版模板

模板就是实现代码重用机制的一种工具,它可实现类型参数化,即把类型定义为参数, 从而实现了代码的可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。在使用模板概念时,经常会遇到这4个概念:函数模板模板函数,类模板模板类。这4个概念非常类似,也经常被我们所误用,本使用经验将主要讲述他们的差异。

一鸣惊人的博客 2019

c++泛型编程之函数模板与类模板

C++泛型编程(Generic Programming)是一种编程范式,它允许你编写与类型无关的代码,这些代码可以在不改变的情况下被多种类型使用。这种类型的编程主要通过模板(Templates)机制来实现。

new9232的博客 1499

函数模板详解(C++)

学习模板,能很好的掌握泛型编程的思想,并通过建立通用的模板大大提高代码的复用性。为在STL中运用系统提供的模板打下基础。

Chie_zz的博客 2184

C++函数模板模板函数的区别

函数模板函数的重载能够实现一个函数名多用,将实现相同或者相似功能的函数用同一个函数名来定义,但是在程序中仍然要分别定义每一个函数。为进一步简化,C++提供了函数模板,实际上是建立一个通用函数,其函数类型形参类型不具体指定,用一个虚拟的类型来代表,此通用函数即为函数模板。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。 模板函数:为函数模板传参,根据实际传入的参数类型生成的一个重载函数即为模板函数,它是函数模板的一次实例化。 ...

weixin_44596487的博客 5645

C++泛型编程

泛型实质上就是不使用具体的数据类型(如 int、double 等),而是使用一种通用的类型来进行程序设计的方法,将程序尽可能通用,将算法从数据结构中抽象出来,成为通用算法。

weixin_73249104的博客 441

sqlite对db文件进行设置密码加密

可以对sqlite的db文件进行设置密码;自己环境win10 64位,32位也应该支持,如果有不支持的地方欢饮留言联系,欢饮大家下载使用,下载不会用了,请查看本人博客

上一篇: java中冒号:的用法
下一篇: 试试54款开源服务器软件 (比较知名的软件大集合)
Nancyse
博客等级 码龄12年 10粉丝 28原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值