模板类型函数和模板类,非类型模板类(2012-02-17 16:51)

从二极管到CMOS:手把手教你搭建数字电路中的基础门电路(附原理图) 本文详细介绍了数字电路中基础门电路的搭建方法,从二极管门电路到现代CMOS门电路的设计与实现。通过原理图解析和实战案例,帮助读者掌握数字电路设计的核心知识,包括电平实现、门电路工作原理及实际调试技巧,适合电子技术爱好者和初学者学习参考。 阅读详情
本文结合代码综合介绍一下模板类型函数,模板参数类和非类型模板参数。其中一些内容源于网络和书籍,因为来源太散就没有全部


标注出处。
1. 模板的概念。
我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。


例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。

//函数1.
int max(int x,int y);
{return(x>y)?x:y ;}
//函数2.
float max( float x,float y){
return (x>y)? x:y ;}
//函数3.
double max(double x,double y)
{return (c>y)? x:y ;}



但如果在主函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。
现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样


就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制,模板定义:模板就是实现代码重用机制的一


种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,


另外一个是类模版。
 
2.   函数模板的写法
函数模板的一般形式如下:
Template <class或者也可以用typename T>
返回类型 函数名(形参表)
{//函数定义体 }




说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加


class <类型 形参表>可以包含基本数据类型可以包含类类型.
请看以下程序:
//模版类型函数声明和定义都在一个文件中
template<class T>
T GetMax(T a,T b)
{
return a>b?a:b;
}


上面这段代码,既可以同时放在头文件中,又可以同时放在源文件中,但是必须声明和定义要在一起。关于其原因,可以参见
模板函数的声明和定义都放在一个文件中


3. 类模板的写法
定义一个类模板:
Template < class或者也可以用typename T >
class 类名{
//类定义......
};




说明:其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。
例如:定义一个类模板:
//头文件,模板类声明
template<class T1,class T2>
class CTemplate{
T1 m_x;
T2 m_y;
public:
CTemplate(T1 a,T2 b)/*:m_x(a),m_y(b)*/;
void ShowData();
};


//源文件,模板类的定义

template<class T1,class T2>CTemplate<T1,T2>::CTemplate(T1 a,T2 b):m_x(a),m_y(b)//初始化列表只能在构造函数的定义中添加
template<class T1,class T2>void CTemplate<T1,T2>::ShowData()
{
	printf("m_x:%d,m_y:%d\n",m_x,m_y);
}


//测试文件
CTemplate<int,char> *imp = new CTemplate<int,char>(1,2);
imp->ShowData();

输出显示如下:


 


 
4.非类型模版参数


非类型形参,指的是模板中的模板形参不是使用class关键字定义的,而是使用C++内置类型定义的形参,比如template<class T, 


int a> class B{},其中的形参a就是非类型形参,他是使用的内置类型int声明的。
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。


//非类型模版参数
template<class T1, int COUNT>
class CStroage{
public:
const int vec_sz;
CStroage(int a):vec_sz(COUNT)
{
}
T1 vec[COUNT];
void Show()
{
printf("sizeof(vec[COUNT]):%d\n",sizeof(vec));


}
};




//测试程序
CStroage<int,20> pImp(5);
pImp.Show();


显示结果:


对于非类型模板的介绍,可以详细参见这篇blog

 
注意:非类型模板形参一般不能用于模板函数中,当然你也可以使用没有强制规定





惯性导航原理(九)-INS的初始对准-初始姿态确定+双矢量定姿 文章目录INS的初始对准INS初始化静基座/静态粗对准静态粗对准—加速度计调平原理加速度计调平静态粗对准—陀螺罗盘思考初始对准的影响因素双矢量定姿原理静态解析粗对准—双矢量定姿静态解析粗对准(续)其它初始对准方法精对准动对准 INS的初始对准 INS的初始对准为初始化的一部分 INS初始化 初始位置: 给定(INS没有初始位置确定的能力,例如从GPS ) 初始速度: 零(静止状态)或给定 初始姿态: 初始对准(INS有能力自己测资态) 粗对准vs. 精对准 静止状态vs. 运动状态 重要性: 失之毫厘,谬 阅读详情

相关推荐

定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

已知 Tclk 为 84MHz , 我们需要 Tout 为 200ms 即 200000us , 不妨先让PSC为 839, 带入上述公式可得 ARR = 19999. 这样算出来之后ARR和PSC都在0~65535的范围, 则可以使用这组参数。例如,如果时钟频率为1MHz,并且PSC设置为1000,则实际的定时频率将为1kHz。当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。例如,如果时钟频率为1MHz,则Tclk为1微秒。

2301_77123899的博客 1万+

C++基础--函数模板

函数模板是通用的函数描述,其使用泛型来定义函数。其实就是有些操作,如果撇开具体的变量的数据类型,其操作是一样的如果我们将这些操作写成一个模板,在调用不同变量的时候就设定好变量类型就可了,后续的操作基本都是一个流程了。 比如我要对两个变量进行交换,那么不管是int型、double型还是long型或者类或者结构体啥的,我都可以这样实现: TA=AAAAA; TB=SB; Ttemp...

上善若水,为而不争 222

使用mmdetection快速复现计算机视觉顶会论文

使用mmdetection中支持的算法运行自定义数据集

m0_56896669的博客 2421

从零开始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载

一、引子 考虑求两数较大值函数max(a,b) 对于a,b的不同类型,都有相同的处理形式: return a 用已有方法解决: (1)宏替换 #define max(a,b) ((a) 存在的问题:避开类型检查 (2)重载 存在的问题:需要许多重载版本 (3)使用函数模板 二、模板 模板是一种参数化的多态工具 所谓参数化的多

Meditation 4714

【DIY】使用STM32及PID算法实现一个磁悬浮玩具

今天教大家来做一个磁悬浮玩具。

小白白学电子 1万+

GEE去云处理代码段解读(位运算)

GEE去云处理代码段解读,包含位运算符号解读、bitwiseAnd()函数、eq()函数解读

jiekeheiguanglan的博客 2067

[c++ template]非类型的函数模板以及非类型的类的模板

template class mm { }; template void ff(T tt,int cc) { } void main() { mm mmm; ff(2,33); system("pause"); } 对于非类型的,浮点数以及字符串的文字都不能使用 日如 template class ccc{};   ccc c;//error 以及全局指针

guandq2106的专栏 675

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化

了解泛型编程会基本使用函数模板和类模板知道函数模板的两种实例化了解非非类型模板参数与模板的特化 了解模板分离编译 C++模板模板初阶型编程函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化隐式实例化显式实例化:在函数名后的中指定板参数的实际类型模板参数的匹配原则类模板类模板的定义格式类模板的实例化模板进阶非类型模板参数模板的特化概念函数模板特化类模板特化全特化偏特化模板分离编译什么是分离编译模板的分离编译模板总结

awofe的博客 2526

【红外DDE算法】一种应用于高动态范围红外可视化的算法

【红外DDE算法】一种应用于高动态范围红外可视化的算法 - 这个算法背后的动机 - 展示这个算法的流程 - 然后讨论各个可调参数的意义。

sunwindl91181的博客 1682

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

我写的第一个模板类

很简单的一个列表类,而且并不是很完善,仅限于在自己的程序中使用。有很多很基本的东西还没搞懂。不过我一直奇怪的是:我将这个类的声明和实现放在不同的文件中时(.h, .cpp),最后在引用用这个类的地方都会出现连接错误,无奈只能将声明和实现放在同一个文件中了(.h),模板类的编译和连接机制到底是怎样的呢? #pragmaoncetemplate<typenameNode...

weixin_30916125的博客 124

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

c11语言编译,vs2012上编程C++语言,C11标准编译error

1 #pragma once2 #include "Durations.h"3 #include "Guards.h"4 #include 56 classCDuration7 {8 public:9 CDuration(void);10 ~CDuration(void);1112 //自定义ID类型13 using id = long;14 //别名标识记...

weixin_35092037的博客 602

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++模板:函数模板和模板函数

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

极简Qt 14万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ 模板函数和非模板函数的重载

关于函数的重载机制,是一个比较复杂的问题,其中涉及到了优先级定义和最佳匹配等问题,如果要阐述清楚,恐怕不是一两篇文章就能说的明白。但是如果掌握了一些常用的“规律”,对于了解程序对重载函数是如何进行选择也有很大的好处,本文尝试将自己理解的知识,结合下面简单的例子简略的说说函数重载机制,文章的摘录部分列出了一些关于程序如何选择重载函数的规则。: ) 例子如下: #include

#+! 4649

非模板类里面的模板构造函数

今天在阅读一本C++书上的例子,示例代码无法编译过。 它里面有这么一个东西,一个类A,类A本身不是定义的模板类,但是它的构造函数却是用的template声明的模板函数(模板构造函数),之前工作直接接触模板比较少,对于这种语法也是第一次这么明确地看到,记录下来备忘。   #include &lt;iostream&gt; using namespace std; class A { publ...

aflyeaglenku的博客(QQ1010316426) 3268

模板的模板参数与非类型模板参数

模板的模板参数 非类型模板参数

kittimzhe的博客 833

模板类的默认模板参数、模板函数不支持默认模板参数

在这个学期开始学习使用模板,当然模板早在大一期间就用到了一些,但是都是作为练习语法用的。这个学期中使用了大量的模板来进行类的设计与实现,具体的来说应该几乎是这个学期的所有的C++代码都是用的模板实现的吧。有些即使没那么大的使用模板价值,但是还是为了积累模板的经验而硬使用了模板。写了这么多的模板后,也就是在上个星期才偶尔在一个帖子里看到默认模板参数这个概念,写了那么多的代码了才知道这个概念感觉很羞愧

坚持理想 面对现实 1万+

C++日记——Day22:函数模板定义、使用、非类型模板参数

概述: 1、所谓泛型编程,是以独立于任何特定类型的方式编写代码。使用泛型编程时,我们需要提供具体程序实例所操作的类习惯或者值。 2、模板是泛型编程的基础。模板是创建类型或者函数的蓝图或者公式。我们给这些蓝图或者公式提供足够的信息,让这些蓝图或者公式真正变成具体的类或者函数,这种转变发生在编译时。 3、模板支持将类型作为参数程序设计方式,从而实现了对泛型程序设计的直接支持。也就是说C++模板机...

weixin_38278993的博客 544

如何让模板函数 对不同类型的参数做不同的处理

比如有个Convert函数,我希望对于能直接用static_cast的就不用dynamic_cast template&lt;typename F, typename T&gt; T* ConvertA(F* from) { //如果是std::is_convertable_v&lt;F, T&gt;是true就用static_cast,否则dynamic_cast } 方案1. S...

killer4747的博客 5488

模板非类型形参的详细阐述

关于模板的非类型形参,网上有很多内容,C++primer只有大概一页的阐述,但是都不够清晰详细。下面我尽可能从自己的角度去给大家描述一下非类型形参的相关细节。如果想进一步理解非类型形参以及模板内容可以阅读C++template这本书,在4.1节,8.3.3节,13.2节都有相关解释。 这里要强调一点,我们对于非类型形参的限定要分两个方面看 1.对模板形参的限定,即template<>里面的参数 2.对模板实参的限定,即实例化时<>里面的参数

Jerish的博客 9664

C++ 模板类的默认模板参数、模板函数不支持默认模板参数

 就像标题说的那样:1、模板类支持默认模板参数、2、模板函数不支持默认模板参数,这里的模板函数包括全局函数与类成员函数两种。使用说明一:[cpp] view plaincopy//模板类的默认模板参数  template&lt;class TypeA = int, class TypeB = float&gt;  class MyClass  {  public:      TypeA value...

随意的风的专栏 3690

类模板中的函数模板的定义和调用(不是模板类中的普通成员函数)

#include using namespace std; template struct A { virtual void foo(); // error: templates may not be ‘virtual’ template /* virtual */ void bar(); }; template void A::foo() { } template templ

晴天的专栏 3000
上一篇: new/delete 和malloc/free 的区别(代码部分)
下一篇: 通过类String看拷贝构造函数,赋值函数的作用和区别
RealOnlyme
博客等级 码龄19年 4粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值