C++学习 Day.9(宏和模板简介)

news2024/11/28 19:31:11

好久没更了,摆还是爽

遗留问题:

(16条消息) int&作为函数返回类型-编程语言-CSDN问答(已解决)

宏:

预处理器编译指令都以#打头 

#define(宏常量)使得预处理器进行文本替换,而不考虑其他,编译器将检查文本正确与否。    不解风情

 宏需要大量括号,凡变量尽量都打一括号。

列如:

#define i* int*
i* a,b;
此时我们的本意是   int *a,*b;
而实际上的代码为   int *a, b;
此时的 b 为 int 型,而非 int* 型

使用宏避免多次包含

reference:

(6条消息) #ifndef,#define,#endif的作用和用法_Junzheng Li的博客-CSDN博客

(7条消息) #ifndef/#define/#endif使用详解_ 司 的博客-CSDN博客_#ifndef _a_h_

例:

 assert宏:验证表达式

语法:

assert (expression that evaluates to true or false);

包含:于<assert.h>头文件

示例:

#include <assert.h> 
int main() 
{ 
 char* sayHello = new char [25]; 
 assert(sayHello != NULL); // throws a message if pointer is NULL 
 // other code 
 delete [] sayHello; 
 return 0; 
}

在我的DEV编译器中出现如下报错:

注: 

 宏不支持任何形式的类型安全,这是一个严重的缺点。另外,复杂的宏调试起来也不容易

 模板:

template:n. 样板;模板;型板

声明模板以关键字template打头 

//模板类,使用需要<type>
template <typename T/*可多写*/> 
class HoldVarTypeT 
{ 
private: 
 T value; 
public: 
 void SetValue (const T& newValue) { value = newValue; } 
 T& GetValue() {return value;} 
};

 instantiation :实例化

template <typename T1, typename T2> 
class HoldsPair 
{ 
private: 
 T1 value1; 
 T2 value2; 
public: 
 // Constructor that initializes member variables 
 HoldsPair (const T1& val1, const T2& val2) 
 { 
 value1 = val1; 
 value2 = val2; 
 }; 
 // ... Other member functions 
};

 实例化:

HoldsPair <int, double> pairIntDouble (6, 1.99);
HoldsPair <int, int> pairInts (6, 500);
声明包含默认参数的模板

可以修改前面的 HoldsPair < > ,将模板参数的默认类型指定为 int
template <typename T1=int, typename T2=int>
class HoldsPair
{
// ... method declarations
};
这与给函数指定默认参数值极其类似,只是这里指定的是默认类型。

这样,前述第二种 HoldsPair 用法可以简写为:

// Pair an int with an int (default type)
HoldsPair <> pairInts (6, 500);
#include <iostream>
using namespace std;

template <typename T1 = double, typename T2 = int >
class HoldsPair {
	private:
		T1 value1;
		T2 value2;
	public:
		HoldsPair(const T1& val1, const T2& val2) // constructor
			: value1(val1), value2(val2) {}

		// Accessor functions

		const T1& GetFirstValue() const {
			cout << "fanhui double " << value1 << endl;
			return value1;
		}
		const T2& GetSecondValue() const;
		//如果这两个函数不给出定义,则无返回,出现return 1;的报错
};

// specialization of HoldsPair for types int & int here
template<> class HoldsPair<int, int> {
	private:
		int value1;
		int value2;
		string strFun;
	public:
		HoldsPair(const int& val1, const int& val2) // constructor
			: value1(val1), value2(val2) {}

		const int & GetFirstValue() const {
			cout << "Returning integer " << value1 << endl;
			return value1;
		}
};

int main() {

	HoldsPair<int, int> pairIntInt(222, 333); //在类型为int,int时调用第二个,否则调用第一个
	pairIntInt.GetFirstValue();

	return 0;
}

模板类的具体化,如上。

模板类和静态成员

示例代码:

#include <iostream>
using namespace std;

template <typename T>
class TestStatic {
	public:
		static int staticVal;
};

// static member initialization
template<typename T> int TestStatic<T>::staticVal;

int main() {
	TestStatic<int> intInstance;
	cout << "Setting staticVal for intInstance to 2011" << endl;
	intInstance.staticVal = 2011;

	TestStatic<double> dblnstance;
	cout << "Setting staticVal for Double_2 to 1011" << endl;
	dblnstance.staticVal = 1011;

	cout << "intInstance.staticVal = " << intInstance.staticVal << endl;
	cout << "dblnstance.staticVal = " << dblnstance.staticVal << endl;

	return 0;
}

Q:静态变量有啥用?

假定您要编写一个将两个值相加的通用函数,为此可编写下面这样的模板函数 Sum()
template <typename T1, typename T2, typename T3>
void Sum(T1& result, T2 num1, T3 num2)
{
result = num1 + num2;
return;
}
 

想要加上不同的值应如下进行编码:参变量可变的模板

#include<iostream>
using namespace std;

template<typename R,typename V>
void Sum(R& result,V& val){
	result+=val;
	cout<<"i have in prime"<<endl;
}

template<typename R, typename First, typename...Rest>
void Sum(R& result, First val1, Rest...valN) {
	result += val1;
	return Sum(result, valN...);
}

int main() {
	double dResult = 0;
	Sum(dResult, 3.14, 4.56, 1.1111);
	cout<<"dResult"<<dResult<<endl;
	
}

注:必须要有基础模板

实例化并使用 std::tuple

引用:(3条消息) C++的get()函数使用详解_Nine_CC的博客-CSDN博客_c++ get

使用static_assert();

static_assert C++11 新增的一项功能,让您能够在不满足指定条件时禁止编译。这好像不可思议,但对模板类来说很有用。例如,您可能想禁止针对 int 实例化模板类,为此可使用 static_assert ,它是一 种编译阶段断言,可用于在开发环境(或控制台中)显示一条自定义消息:
static_assert(expression being validated, "Error message when check fails");
要禁止针对类型 int 实例化模板类,可使用 static_assert( ) ,并将 sizeof(T) sizeof(int) 进行比较,如果它们相等,就显示一条错误消息:
static_assert(sizeof(T) != sizeof(int), "No int please!");

如图:

DEV编译器报错为: 

学习本章介绍的模板知识后,便为学习如何使用 STL 做好了准备!

问:在头文件中,为何要防范多次包含?
答: 多次包含防范使用 #ifndef #define #endif ,可避免头文件出现多次包含或递归包含错误,有时还可提高编译速度。
问:如果所需的功能使用宏函数和模板都能实现,在什么情况下应使用宏函数,而不是模板?
答: 在任何情况下都应使用模板,而不是宏函数,因为模板不但提供了通用实现,还是类型安全
的。宏函数不是类型安全的,最好不要使用。
问:调用模板函数时,需要指定模板参数类型吗?
答: 通常不需要,因为编译器能够根据函数调用使用的实参推断出模板参数类型。
问:对于特定模板类,每个静态成员有多少个版本?
答: 这完全取决于针对多少种类型实例化了该模板类。如果针对 int string 和自定义类型 X 实例
化了该模板类,则每个静态成员都有三个不同的版本 每种模板实例化一个。

编写模板函数Display,它可调用不同数量和类型的的参数并显示。

#include<iostream>
using namespace std;

template<typename t0>
void Display(t0& e0) {
	cout << "different from xiamian de , i will be used when the en is used\
 that's to say , the element en won't be used int this case" << endl;

}


template<typename t0,  typename ...other>
void Display(t0& e0, other...en) {
	cout << e0 << endl;
	return Display(en...);
}

int main() {
	string a = "fu huo ba", b = "wo";
	string c = "de", d = "ai", f = "ren";
	Display(a, b, c, d, f, "hhh");
	return 0;
}

 运行结果:

 

一版和上面稍有不同的代码:

#include<iostream>
using namespace std;

void Display() {
	cout << "i will be use at last,when all the elements are use\
 even Display(en)" << endl;
}

template<typename t0,  typename ...other>
void Display(t0& e0, other...en) {
	cout << e0 << endl;
	Display(en...);
}

int main() {
	string a = "fu huo ba", b = "wo";
	string c = "de", d = "ai", f = "ren";
	Display(a, b, c, d, f, "hhh");
	return 0;
}

运行结果: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Acwing---795.前缀和

前缀和1.题目2.基本思想3.代码实现4.总结1.题目 输入一个长度为n的整数序列。 接下来再输入m个询问&#xff0c;每个询问输入一对l&#xff0c;r。 对于每个询问&#xff0c;输出原序列中从第l个数到第 r 个数的和。 输入格式 第一行包含两个整数n和m。 第二行包含n个整数&am…

一种简洁又不失优雅的工作流:极狐 flow

本文来自&#xff1a; 万金 极狐(GitLab)解决方案专家 杨周 极狐(GitLab) 高级解决方案架构师 极狐(GitLab) 市场部内容团队 我们提到的 Workflow 是指什么&#xff1f; 我们在日常开发工作中提到的 Workflow 通常是指通过 Git&#xff08;版本控制工具&#xff09;实现的分布式…

JavaSE学习day1_03, Java的发展

5. Java语言的扩展知识,重点 5.1 Java语言的发展 java语言前身是oka语言. JDK5&#xff1a;第一个大版本号更新 JDK8&#xff1a;企业中最常用的版本 JDK17&#xff1a;课程中学习的版本 特点&#xff1a;兼容性。 用jdk8编写的代码&#xff0c;用17可以运行 用jdk17编写…

定位bug

1、bug定位常用工具   Firefox——firebug、web developer、 live http headers、http fox IE插件——httpwatch 第三方工具——fiddler 慢速网模拟工具——firefox throttle 1.该选择框使用来选择资源的&#xff0c;当网页被加载的时候向服务器端请求出来的文件包括.htm…

二维码识别率优化实践

本文字数&#xff1a;5939字预计阅读时间&#xff1a;15 分钟概述长按图片识别二维码在移动端是很常见的操作&#xff0c;长按后需要对图片进行识别&#xff0c;并且将二维码中所包含的数据解码出来。在我们的业务场景中&#xff0c;是通过点击图片进入大图预览页面。长按大图预…

项目管理工具dhtmlxGantt甘特图入门教程(六):dhtmlxGantt的扩展完整列表

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理控件应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 这篇文章给大家讲解dhtmlxGantt的扩展完整列表。 DhtmlxGantt正版试用下载&#xff08;qun&#xff1a;764148812&…

【NI Multisim 14.0原理图环境设置——电路总体设计流程】

目录 序言 &#x1f34a;知识点 一、电路板总体设计流程 &#x1f349; 1.创建电路文件 &#x1f349;2.规划电路界面 &#x1f349;3.放置元器件 &#x1f349;4.连接线路和放置节点 &#x1f349;5.连接仪器仪表 &#x1f349;6. 运行仿真并检查错误 &#x1f349;7…

Dropzone4 for MAC 文件拖拽增强工具

前言 ​​Dropzone for mac是一款文件拖拽操作增强工具&#xff0c;可以让我们把大部分工作都通过拖拽来完成&#xff0c;只需将文件拖拽到菜单栏上的窗口即可。比如保存文本、发送邮件、FTP上传、打开应用等等。提高了用户的工作效率。 下载 Dropzone4 特征 -打开应用程序…

连接格式优化,支持自定义

12月&#xff0c; eKuiper 团队继续专注于 1.8.0 版本新功能的开发。我们重构了外部连接&#xff08;source/sink) 的格式机制&#xff0c;更加清晰地分离了连接、格式和 Schema&#xff0c;同时支持了格式的自定义&#xff1b;受益于新的格式机制&#xff0c;我们大幅完善了文…

echarts中formatter修改鼠标悬浮事件信息操作、echarts地图块、散点区分触发点击事件 只触发散点问题详解

这里写目录标题1、实例2、案例详解1、实例 这次我拿echarts中 地图组合散点图的实例 &#xff01;&#xff01;&#xff01;实现效果&#xff1a;滑到散点显示不同于地图块的信息 及 formatter 提示窗自定义&#xff01;&#xff01;&#xff01; 这个显示项目名称为"文昌…

千锋教育+计算机四级网络-计算机网络学习-01

目录 课程链接 最早的广域网 计算机网络发展阶段 计算机网络的定义与要点 英文单词网络术语与解释 计算机网络分类 广域网技术 城域网 局域网 个人局域网 五种基本的网络拓扑结构​ 误码率 电路交换网特点 分组交换 交换方式 TCP/IP协议族 IP协议介绍 TCP协议介绍 …

OpenCV的solvePnP函数和Dlib估计头部姿势

一、姿势估计概述1、概述在许多应用中&#xff0c;我们需要知道头部是如何相对于相机倾斜的。例如&#xff0c;在虚拟现实应用程序中&#xff0c;可以使用头部的姿势来渲染场景的右视图。在驾驶员辅助系统中&#xff0c;在车辆中观察驾驶员面部的摄像头可以使用头部姿势估计来查…

React(coderwhy)- 06(RTK)

认识ReduxToolkit 认识Redux Toolkit ◼ Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。  在前面我们学习Redux的时候应该已经发现&#xff0c;redux的编写逻辑过于的繁琐和麻烦。  并且代码通常分拆在多个文件中&#xff08;虽然也可以放到一个文件管理&#xff0c;…

[RoarCTF 2019]Online Proxy(x-forwarded-for盲注)

这道题点开题目 然后题目显示不出网&#xff0c;一开始误认为是ssrf了&#xff0c;但是没有更多的信息了。 源码有一个ip会不会是修改X-Forwarded-For就可以了呢&#xff0c;抓包试一下&#xff0c; 发现有两个ip&#xff0c;一个当前一个是last上一个的意思把&#xff0c;…

数字图像处理实验——图像增强

一、实验目的与要求1.掌握图像空域点处理增强方法&#xff0c;包括图像求反&#xff0c;线性灰度变换&#xff0c;以及直方图均衡化方法&#xff1b;2.熟练掌握空域滤波增强方法&#xff0c;包括平滑滤波器及锐化滤波器。二、实验内容及步骤1.图像的求反、线性灰度变换、直方图…

【回答问题】ChatGPT上线了!比较流行的监督学习模型

监督学习模型是指在训练过程中&#xff0c;使用带有正确答案的标记数据来进行学习。常见的监督学习模型包括逻辑回归、决策树、支持向量机、朴素贝叶斯分类器、神经网络等。最近流行的监督学习模型还包括深度学习模型&#xff0c;如卷积神经网络和循环神经网络。 下面给出一些…

超级浏览器能帮来赞达(Lazada)老板什么忙?

近几年东南亚市场因人口红利及互联网的高度普及倍受关注&#xff0c;东南亚市场成了跨境市场的香饽饽&#xff0c;像来赞达&#xff08;Lazada&#xff09;、虾皮&#xff08;shopee&#xff09;等平台都是最近东南亚地区比较受欢迎的在线购物网站。根据第三方发布的调查报告显…

QGroundControl中使用QT语言家功能

QT语言家支持多种语言功能&#xff0c;在QGC中也很好的使用了该功能&#xff0c;下面对该功能是一些理解进行整理。首先在QGC使用语言家功能中分为qml文件和.c文件&#xff0c;两种略有不同。在.c文件中使用tr()将需要翻译的内容进行包裹在qml文件中使用qsTr()进行包裹下面以新…

【手把手一起学习】(一) Altium Designer 20 软件安装

Altium Designer 20 软件安装 1、解压安装压缩包 2、打开Setup文件夹 3、选中AltiumDesigner20Setup&#xff0c;选择“以管理员身份运行” 4、直接点击Next 5、选择“Chinese”&#xff0c;点击Next 6、直接点击Next 7、选择安装路径 8、直接点击Next 9、继续Next 10、软件安…

软件设计师通关攻略

软件设计师考什么&#xff1f;一、基础知识1.计算机科学基础知识2.计算机系统知识3.系统开发和运行知识4.面向对象基础知识5.信息安全知识6.标准化、信息化和知识产权基础知识7.计算机专业英语二、应用技术1.外部设计2.内部设计3.数据库应用分析与设计4.程序设计5.系统实施6.软…