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

GEE影像重采样实战:从10米到500米,如何用.reduceResolution和.reproject统一尺度? 本文详细介绍了在Google Earth Engine (GEE)平台中,如何利用`.reduceResolution()`和`.reproject()`方法解决多源遥感影像的尺度统一难题。通过实战案例,从哨兵2号10米分辨率影像聚合至MODIS 500米尺度,阐述了聚合规则选择、参数配置及效果验证的全流程,为环境监测、农业分析等领域的跨尺度数据融合提供了关键方法。 阅读详情
本文结合代码综合介绍一下模板类型函数,模板参数类和非类型模板参数。其中一些内容源于网络和书籍,因为来源太散就没有全部


标注出处。
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

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





Google 二次签名 导致 Facebook , Google 登录失败 google 授权登录 阅读详情

相关推荐

做量化没有实时数据怎么行?我找到一个超级好用的Python库,速度还贼快!

今天咱们介绍了 pytdx 这个神奇的库,重点包括:✅ 安装 pytdx✅ 连接 TDX 服务器✅ 获取实时行情数据✅ 获取 K 线数据✅ 获取分笔成交数据总之,pytdx 是一个速度快、免费、易用的量化利器,适合 A 股量化交易的同学们使用。如果你还在为数据发愁,赶紧试试吧!🚀顺手再看就是对花姐最大的支持,期待你的关注。

奔跑的蜗牛 5724

C++基础--函数模板

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

上善若水,为而不争 222

FISCO BCOS平台的用户权限控制与分类管理

在区块链技术日益广泛应用的今天,如何管理与控制不同用户的权限,确保系统的安全性与高效性,成为了区块链平台不可忽视的一部分。FISCO BCOS作为一款高效的联盟链平台,通过细粒度的权限控制机制,提供了对不同用户权限的有效管理。本文将深入探讨FISCO BCOS如何实现用户的权限控制,并对不同用户进行分类与权限管理。FISCO BCOS平台通过精密的权限控制机制,不仅提供了对用户表和系统表的细粒度权限管理,还通过工具与接口为开发者和管理员提供了便捷的权限配置与查询功能。

2201_75798391的博客 1060

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

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

Meditation 4714

PCB Layout总结

PCB Layout作为硬件设计中的一个环节,也是很重要的一个环节;在硬件电路设计合理的情况下,他其实是影响性能的一个绝对重要的指标。现在很多的PCB Layout工程师都是按照硬件工程师或者PI SI工程师给出的约束规则来完成布局布线的,这些也就是俗称的 “拉线工”。他们重复而机械的完成一块块PCB设计,一段时间设计后,他们中的一些或许已经有了这样的一些经验:哪些要做等长,哪些要走粗、哪些要平...

xydlxd118的博客 2583

STM32CubeIDE中文注释变乱码终极解决方案:3步设置永久解决锟斤拷问题!

你是否在STM32CubeIDE中遇到过这样的崩溃场景?——精心编写的中文注释在重新生成代码后变成“锟斤拷”乱码,不仅影响代码可读性,反复修改更是浪费大量时间!作为STM32开发者,我曾被这个问题困扰许久,试过修改软件设置、工程编码却始终治标不治本。直到发现这个基于Java环境变量的终极解决方案,才彻底解决了中文乱码难题。

smart_boy__的博客 2957

[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

Ubuntu双系统引导修复实战:boot-repair工具详解

本文详细介绍了使用boot-repair工具修复Ubuntu双系统引导丢失问题的实战方法。当GRUB引导菜单因安装新系统或更新而损坏时,通过制作Ubuntu启动盘进入Live环境,安装并运行boot-repair,可一键完成系统修复引导,自动化执行GRUB重装与配置,解决无法进入Windows或Ubuntu的常见故障。

weixin_29224589的博客 356

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

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

awofe的博客 2526

【Basis】Lumerical licence center 无法连接的问题

端口,我们需要确认该端口是否被其他程序占用。这里我们将介绍如何处理这一问题。后,今天电脑更新后我无法打开。终结占用该端口的程序后再次打开。

u011699626的博客 314

PyTorch深度学习实战(29)——变分自编码器(Variational Autoencoder, VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。

盼小辉丶的博客 1万+

我写的第一个模板类

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

weixin_30916125的博客 124

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

今天在阅读一本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、付费专栏及课程。

余额充值