C++学习四:模板、函数模板、类模板、非类型模板参数、默认类型模板参数

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集 YOLOv5入门实践第2步,手把手教你使用labelimg标注数据集 阅读详情

一、模板

1、目的

        编写与类型无关的代码。

2、概念

        模板是一种对类型进行参数化的工具,通常有两种形式:

1)函数模板

        函数模板针对仅参数类型不同的函数

        参数类型不一样的但是功能及函数名一致的函数
template <class形参名,class形参名,......>返回类型函数名(参数列表)

{
函数体

};

2)类模板


        类模板针对仅数据成员和成员函数类型不同的类

        成员属性的类型和成员函数的类不一样但是成员属性及函数一样的类

template<class形参名,class形参名,…>class类名
{

函数体
};

注意:

        模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。声明数据类型参数标识符的关键字既可以用class也可以用typename

二、函数模板

1、目的

        编写与类型无关的代码

2、函数模板

        当函数功能和函数名一致但参数类型不同时,需要定义函数模板

3、语言形式

        template <class  形参名1, typename 形参名2, ......>

        返回值 函数名(参数列表)

        {

                函数体

        }

        eg:函数模板

   

#include <iostream>
using namespace std;
template <class T>
T add(T &a, T &b)
{
    T c = a+b;
    return c;
}
int main()
{
    int m = 52;
    int n = 1314;
    int c = add<int>(m, n);
    cout << "c = " << c << endl;
    return 0;
}

结果:

三、类模板

1、类模板

        当类名和成员变量及成员函数的名字一致,但成员变量和函数的类型不同的时候就需要定义成类模板;

2、语法形式

        template <class 形参名1,typename 形参名2, .......>

        class 类名{

                成员变量和成员函数;

          };

eg:类模板

#include <iostream>
using namespace std;
template <class T>
class Demo
{
    public:
        Demo(T val):val(val)
        {
            cout << __func__<<": "<<__LINE__<<endl;
         }
        ~Demo()
        {
            cout << __func__<<": "<<__LINE__<<endl;
        }
        
        void setval(T val)
        {
            this->val = val;
        }
        T getval()const;
    private:
        T val;
};
template <class T>
T Demo<T>::getval()const
{
    return this->val;
}
int main()
{
    Demo<int> obj(52);
    cout<<obj.getval()<<endl;
    obj.setval(1314);
    cout<<obj.getval()<<endl;
    return 0;
}

结果:

四、非类型模板参数

1、理解

        参数列表中定义的确定类型的变量

2、示例

        template <class T, int var> //T:类型形参名  var:非类型模板参数

        class 类名

        {

                成员变量和成员方法

        };

eg:

#include <cassert>
#include <iostream>
using namespace std;
template <class T, int len> // len:数组长度
class Array
{
    public:
        Array()
        {
            ptr = new T[len];
            assert(NULL!=ptr);
            cout << __func__<<": "<<__LINE__<<endl;
         }
        ~Array()
        {
            delete [] ptr;
            cout << __func__<<": "<<__LINE__<<endl;
        }

        void setval(int index, T val)
        {
            ptr[index] = val;
        }
        T getval(int index)const;
    private:
        T *ptr;
};
template <class T, int len>
T Array <T, len>::getval(int index)const
{
    return ptr[index];
}
int main()
{
    Array <int, 10> a;
    int i = 0;
    for(i = 0; i < 10; i++)
        a.setval(i,i+1);
    for(i = 0; i < 10; i++)
        cout<<"get: "<<a.getval(i)<<" ";
    return 0;
}

注意:
非类型形参在模板定义的内部是常量值
非类型模板的形参只能是整型、指针和引用,像double,string,string **这样
的类型是不允许的。但是double &, double *,对象的引用或指针是正确的。非类型模板形参的实参如果是表达式,则必须是一个常量表达式,在编译时计算出结果。
非类型模板形参和实参间允许类型转换

五、默认类型模板参数

1、理解

        可以给类模板的模板形参指定默认类型

2、示例

template<class T>
		class Demo
		{
			public:
				Demo(T val) : val(val)
				{
					cout << __func__ << ":" << __LINE__ << endl;
				}
				~Demo()
				{
					cout << __func__ << ":" << __LINE__ << endl;
				}
				
				void setval(T val)
				{
					this->val = val;
				}
				
				T getval() const;
				
				friend template<class M>
		ostream &operator <<(ostream &,const Demo<M> &);
				
			private:
				T val;
		};

//类外部成员定义成员方法

template<class T>
		T Demo<T>::getval() const
		{
			return this->val;
		}
		
		template<class >
		ostream &operator <<(ostream &os,const Demo<T> & obj)
		{
			os << obj.val;
			return os;
		}
		int main()
		{
			Demo<int> obj(666);
			
			cout << obj << endl;
		
			return 0;
		}

315、弱电基础知识介绍 常见的弱电系统包括:闭路电视监控系统、防盗报警系统、门禁系统、电子巡更系统、停车场管理系统、可视对讲系统、家庭智能化系统及安防系统、背景音乐系 统、LED显示系统、等离子拼接屏系统、DLP大屏系统、三表抄送系统、楼宇自控系统、防雷与接地系统、寻呼对讲及专业对讲系统、弱电管道系统、UPS不 间断电源系统、机房系统、综合布线系统、计算机局域网系统、物业管理系统、多功能会议室系统、有线电视系统、卫星电视系统、卫星通讯系统、消防系统、电话 通讯系统、酒店管理系统、视频点播系统、人力资源管理系统等等。 阅读详情

相关推荐

别再死磕GAN了!用PyTorch从零实现DDPM图像生成(附CIFAR-10完整代码)

本文详细介绍了如何使用PyTorch从零实现DDPM(Denoising Diffusion Probabilistic Models)图像生成模型,并在CIFAR-10数据集上进行训练和测试。通过对比GAN,DDPM展现出更稳定的训练过程和更高质量的生成效果。文章包含完整的代码实现、训练技巧和优化建议,帮助开发者快速掌握这一前沿的生成模型技术。

weixin_33720078的博客 630

C++ 模板详解(二)

从实例中我们可以总结如下:类模板如果有多个类型形参,如果使用类型形参默认值则尽量放在参数列表的末尾,而且默认的参数类型必须相同。如果从第一个形参设定了默认值之后的所有模板形参都要设定和第一个形参同类型的默认值。3、类模板类型形参默认值和函数的默认参数一样,如果有多个类型形参则从第一个形参设定了默认值之后的所有模板形参都要设定默认值,比如。类模板类型形参默认值和函数的默认参数一样,如果有多个类型形参则从第一个形参设定了默认值之后的所有模板形参都要设定默认值,比如。后的形参表应省略默认的形参类型。

m0_60104735的博客 1256

NotebookLM平替实测:用Open Notebook+Ollama零成本搭建私有AI知识库

本文提供了一份详细的实战指南,教你如何利用Open Notebook与Ollama,在本地零成本搭建一个功能强大且完全私有的AI知识库。通过Docker容器化部署,实现数据绝对安全、模型自由选择与离线运行,是NotebookLM等云端工具的绝佳平替方案,尤其适合注重数据隐私的教育工作者、研究者及小团队。

weixin_29052717的博客 513

[C++] friend template function

一个带有友元函数的类模板如下: template <typename T> class Foo { friend std::ostream& operator<< (std::ostream& os, const Foo<T>& a); }; operator<<()被声明为非模板友元函数,对于每一个Foo类使用的类型T...

selfsongs 464

DIY音乐播放器:用VS1053模块+Arduino打造你的专属MP3播放器(附完整代码)

本文详细介绍了如何使用VS1053音频解码模块与Arduino开发板,从零开始构建一个功能完备的桌面级MP3播放器。内容涵盖硬件架构设计、SPI总线共享、底层驱动编写、双缓冲区数据流管理以及用户交互实现,并提供完整的代码示例与性能优化建议,帮助创客打造高度可定制的专属音乐播放设备。

weixin_29189003的博客 286

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 352

模板-template

模板-template 文章目录模板-template泛型模板函数模板函数模板概念函数模板格式函数模板原理类模板类模板格式类模板实例类模板的实例化类模板的默认模板类型形参 泛型模板 //实例:如何实现一个通用的交换函数 void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double& left, double& right) { d

weixin_53691382的博客 687

浅谈一下小波变换和EEG信号处理

浅谈小波变换,总结不是很到位,请大家指正。

qq_45045249的博客 2862

模板参数类型

文章目录模板参数类型整数模板参数函数指针模板参数指针及引用模板参数成员函数指针模板参数模板型模板参数 这是《深入实践C++模板编程》第三章“模板参数类型详解”的读书笔记。 模板参数类型 模板参数通常表示类型,表示类型的模板参数称为类型模板参数(type template parameter);此外还有非类型模板参数(non-type template parameter),非类型模板参数包含以下四...

KangRoger的专栏 7601

房产平台系统小程序源码

🏠 一键解锁购房新体验 🔓房产小程序 实现前端 发布二手房 租房 商品 求租 求购等信息;后台发布 新房,二手房租房 商品 写字楼 求租求购等房源信息;功能完善的一块房产小程序。

2401_84413757的博客 795

基于大疆TSDK与Pix4D的热红外数据工程化处理:从RJPG到温度正射影像的完整工作流

本文详细介绍了基于大疆TSDK与Pix4D的热红外数据工程化处理完整工作流。通过Python脚本自动化解析RJPG格式的热红外图像,提取并转换其中的原始辐射数据为包含真实温度信息的TIFF文件,再结合Pix4Dmapper进行批量拼接,最终生成可直接用于GIS分析的温度正射影像图。该流程解决了手动处理效率低下、参数校准复杂等难题,实现了从原始数据到定量分析成果的高效、准确、可重复生产。

weixin_29161785的博客 375

C++之:模板元编程(三) 默认模板参数

一、类模板的默认模板参数原则   1、可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值。   2、类模板的类型形参默认值形式为: template<class T1, class T2=int> class A{}; 为第二个模板类型形参T...

weixin_34008784的博客 557

【UE5】VoskPlugin实战:离线语音识别与实时文本转换全流程解析

本文详细解析了如何在UE5中利用VoskPlugin实现离线实时语音转文字功能。从环境搭建、插件配置、核心代码编写到蓝图测试,提供了完整的实战教程。重点阐述了离线方案零延迟、数据私密的优势,并分享了模型选择、性能优化及常见问题的解决方案,帮助开发者快速构建稳定可靠的语音交互系统。

weixin_29001655的博客 618

C++编程——类模板

文章目录1 类模板语法2 类模板与函数模板的区别3 类模板中成员函数创建时机4 类模板对象做函数参数 1 类模板语法 类模板的作用:建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表 语法: template<typename T> 类 解释: template声明创建模板 typename表明其后面的符号是一种数据类型,可以用class代替 T是通用的数据类型,名称可以替换,通常为大写字母 示例: //类模板 template<class NameType, cl

professor_tao的博客 3万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++模板进阶 非类型模板参数 模板的特化 分离编译的深入探索

本文深入探讨C++模板进阶知识,涵盖非类型模板参数(常量作为模板参数,解决宏定义局限)、模板特化(函数模板与类模板全特化/偏特化,处理特殊类型场景)及分离编译原理(剖析模板声明与定义分离导致链接错误的底层原因,提供显示实例化与直接在头文件定义两种解决方案),助读者全面理解模板高级特性与编译机制

2402_87731470的博客 2317

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++类模板详解

类模板是一种用来生成类定义的模板,其中可以包含一个或多个类型参数。这些类型参数可以在定义类的时候替换为任意类型,从而使得我们能够创建适用于多种数据类型的通用类定义。类模板的定义使用 template或来声明一个类型参数。

weixin_44115575的博客 5205

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++类模板

C++类模板 模板是C++的高级特性,分为函数模板和类模板。 使用模板能够快速建立里具有类型安全的类库集合和函数集合。 关于函数模板的学习————》》C++函数模板 本文主要介绍类模板。 使用template关键字不但可以定义函数模板,也可以定义类模板,类模板代表一族类,是用来描述通用数据或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。类模板可以说是用类生成类......

好好学习天天向上 3597

C++模板进阶:探索非类型参数、特化与分离编译的深层奥秘

C++模板进阶涵盖三大核心特性:非类型模板参数允许在编译期使用常量值作为模板参数,实现如固定大小数组的灵活容器;模板特化针对特殊类型提供定制实现,包括函数模板特化和类模板的全特化与偏特化,解决通用模板处理指针等类型时的逻辑偏差;分离编译问题揭示模板声明与定义分置不同文件时的链接错误,通过将定义置于头文件或显式实例化解决。掌握这些进阶知识能提升代码的灵活性与鲁棒性,为深入理解STL及模板元编程奠定基础。

好好学习,天天向上 9657

【C++】模板进阶

本篇文章博主会与大家共同学习非类型模板参数、类模板的特化以及模板的分离编译相关内容。

℉f的博客 2044

C++模板-33-类模板和函数模板的区别

这篇开始学习类模板相关知识,本篇主要学习什么是类模板,还有类模板和函数模板的区别 1.类模板语法 template <class T> 类 模板声明下面是函数就是函数模板,如果是类就叫类模板 2.一个类模板例子 下面写一个Person类 类模板,看看如何定义和如何使用类模板 #include <iostream> #include <string> using namespace std; //类模板 template <class T..

Anthony_tester的博客 5799

全面总结C++类模板使用的基础知识

✨引言 建立一个通用类,类中的成员数据类型可以不具体确定,先用一个虚拟的类型来代表示例: 先使用template关键字声明类模板,接着创建Person类,属性name和age用虚拟类型T1和T2声明,这就是最简单的类模板定义。示例: 可以看到第一行代码T2的后面指定了类型为整型,所以创建类模板对象的时候可以省略T2数据类型的指定,但是切记 :在不给参数列表最后一个虚拟类型指定数据类型的情况下是无法做到参数列表含有默认参数的。 类模板中的成员

叶落秋白的博客 3288

C++模板一文搞定函数模板和类模板

模板是C++封装特性的体现,利用模板能够将多个功能类似的函数或类封装起来同一管理。

AMO524的博客 965

【C++从入门到放弃】模板进阶——非类型模板参数、类模板的特化、模板的分离编译

之前我已经写过一篇关于模板的博客,在之前那篇文章的基础之上再对模板进行补充。链接:模板初阶通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,比如:实现了一个专门用来进行日期大小比较的函数模板。// 函数模板 -- 参数匹配 template < class T > bool Greater(T left , T right) {// 可以比较,结果正确 Date d1(2023 , 6 , 20);

@情话 741

c++类模板详解

学习目标:掌握类模板成员函数分文件编写产生的问题以及解决方式问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到解决:解决方式1:直接包含.cpp源文件解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制。

m0_62681656的博客 3433

C++模板编程入门:从函数模板到类模板的实战指南

泛型编程是现代C++的核心范式之一,它通过参数化类型实现了算法和数据结构的通用性。其基本原理是在编译期根据具体类型生成特化代码,从而在保持类型安全的同时避免了运行时开销。这种技术价值在于显著提升了代码的复用性和可维护性,使得开发者能够编写一次逻辑即可适配多种数据类型。在工程实践中,泛型编程广泛应用于容器库、算法库和通用工具组件的开发,例如标准模板库(STL)中的vector和sort。本文聚焦于C++模板技术,深入解析函数模板的隐式推导与显式指定机制,以及类模板的实例化过程与成员函数定义规范,帮助读者掌握编

weixin_30847865的博客 3217

C++学习:六个月从基础到就业——模板编程:类模板

类模板的定义使用templatetemplate <typename T> // 或 template <class T>private:public:这里定义了一个简单的容器类模板,可以存储任意类型的元素。模板参数T在类定义中用作占位符,表示将来使用类模板时会被具体类型替换。类模板的成员函数可以在类内定义,也可以在类外定义。// 类内定义(如前面例子中的size()函数)public:} // 直接在类内定义// ...其他声明// 类外定义count(0),

qq_53773901的博客 1276
上一篇: C++学习三:一.运算符重载、1.语法形式、可以被重载的运算符、2)不被重载的运算符;二.友元运算符重载、语法形式;三.成员运算符重载1.理解2.语法形式;四、运算符重载的注意事项
下一篇: C++学习五:类继承、基类(父类)和派生类(子类)、公有继承(public继承)、私有继承(private继承)、保护继承(protected继承)、子类构造函数和析构函数、is-a、has-a关系。
西装没钱买
博客等级 码龄4年 620粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值