【C++】模板template

这篇具有很好参考价值的文章主要介绍了【C++】模板template。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ C++
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

认识模板

模板是C++中泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者说是公式。

当使用一个vector这样的泛型类型时,或者find这样的泛型函数时,我们提供足够的信息,将蓝图转化成类或者函数。这种转化发生在编译时。

function template函数模板

比如我们想写一个swap函数来交换两个数的值,在C++中我们可以用函数重载来重载多个函数来实现对不同类型的交换。比如我们要交换int 和 double类型,那么仅仅重载一个 swap(int& x ,int& y)是不够的。还需要重载一个swap(double& x,double& y) 函数。 但如果我还想交换其他的类型,也要写出其他类型对应的函数重载。这样就显得十分麻烦。所以这时候我们就可以function template(函数模板) 来减少我们需要写的代码。

template<class T> //定义函数模板
void Swap(T& x, T& y) //T是模板参数,也就是你传入的参数
{
	T tmp = x;
	x = y; 
	y = tmp;
}
int main()
{
	int i1 = 5, i2 = 10;
	double d1 = 5.5, d2 = 10.5;
	string str1 = "hello", str2 = "world";
	cout << "交换前:" << endl;
	cout << "i1 : " << i1 << " , i2 :" << i2 << endl;
	cout << "d1 : " << d1 << " , d2 :" << d2 << endl;
	cout << "str1 : " << str1 << " , str2 :" << str2 << endl;
	
	Swap(i1, i2);
	Swap(d1, d2);
	Swap(str1, str2);
	cout << "交换后:" << endl;
	cout << "i1 : " << i1 << " , i2 :" << i2 << endl;
	cout << "d1 : " << d1 << " , d2 :" << d2 << endl;
	cout << "str1 : " << str1 << " , str2 :" << str2 << endl;

	return 0;
}

代码运行结果:

【C++】模板template,小林的C++之路,c++,开发语言

我们写了一份代码,就可以交换所有类型,而不用频繁的去自己写函数重载。

class类模板

类模板是用来生成类的蓝图,与函数模板不同的是,编译器不能为类模板推断模板参数类型。为了使用类模板,我们必须在类名后面加<>中提供额外信息。

template <class T>
class Node
{
public:
	void fun()
	{
		cout << "T* : " << typeid(next).name() << endl;
		cout << "T : " << typeid(val).name() << endl;
	}
private:
	T* next;
	T val;
};

int main()
{
	Node<int> ni;
	ni.fun();
	cout << endl;

	Node<double> nd;
	nd.fun();
	cout << endl;

	Node<char> nc;
	nc.fun();

	return 0;
}

运行结果:

【C++】模板template,小林的C++之路,c++,开发语言

此时我们就可以发现,你<>中传什么类型进去,那么你类中的T就是什么类型。这就大大的方便了我们的编码,如果没有模板,那么每个类型都要安插一个这样的类出来,是非常麻烦的。

模板特化

如果你想对不同的模板参数,做不同的处理,那么此时你可以用模板指定类型。比如你有一个正常的模板,但是当模板参数为double时想做一下特殊处理,那么我们可以再定义一个类型模板的类。这样再生成模板时会优先生成最匹配的那一项

//普通模板
template<class T>
class A
{
public:
	A()
	{
		cout << "T()" << endl; 
	}
};

//特化
template<>
class A<double>
{
public:
	A()
	{
		cout << "double()" << endl;
	}
};

int main()
{
	A<int> ai;
	A<char> ac;
	A<double>ad;
	return 0;
}

我们来看看它们会调用哪些构造函数。

【C++】模板template,小林的C++之路,c++,开发语言

我们发现,当在其他模板参数类型时会调用T(),但是当模板参数为double时,调用的是double()。 这也就意味着当模板参数为double时,那么会优先选择最匹配的。这种行为被称为特化。

半特化(偏特化)

当你要传入的模板参数,一半需要自动推导,一半又需要自己定义时,可以使用半特化。

template<class T1,class T2>
class A
{
public:
	A()
	{
		cout << "A<T1,T2>" << endl; 
	}
};

template<class T1>
class A<T1,char>
{
public:
	A()
	{
		cout << "A<T1,char>" << endl;
	}
};

int main()
{
	A<int,int> a1;
	A<double,char> a2;
	A<char,char>a3;

	return 0;
}

运行结果:

【C++】模板template,小林的C++之路,c++,开发语言

我们发现,只要一个模板参数对应,那么就会优先选择对应的那个。

模板原理

模板的原理其实就是根据你所传的模板参数,又给你自动生成了一个类。而这个过程在编译时发生。就比如如下这个代码。

template<class T1,class T2>
class A
{
public:
	T1 a;
	T2 b;
};

int main()
{
	A<int,int> a1;
	A<double,char> a2;
	A<char,char>a3;

	return 0;
}

它在编译后实际上是这样的

class A
{
public:
	int a;
	int b;
};

class A
{
public:
	double a;
	char b;
};

class A
{
public:
	char a;
	char b;
};

会生成三个A类。分别对应的模板参数

A<int,int> a1;
A<double,char> a2;
A<char,char>a3;

当然,我们在编码的时候是无法用相同的类名的。但在编译时,会有类似于函数重载的机制(个人猜测)生成出多个类。

所以,函数模板的本质就是方便你编码。等编译时再为你自动生成你当初传入的模板参数时对应的类。也就是说,虽然表面上你写的代码减少了,但本质上需要的代码并没有减少。只是在编译时为你自动生成了。文章来源地址https://www.toymoban.com/news/detail-656589.html

到了这里,关于【C++】模板template的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go语言模板处理包text/template详解

     本文对go语言内置模板处理包\\\"text/template\\\"常用操作汇总进行了详解,非常全面,一次搞定你的问题!还不收藏等啥呢! 目录 通用结构体定义 通用转换 1,基础操作 2,解析文件 3,自定义函数调用 4,循环遍历 5,语句、运算符、函数 6,变量与操作符

    2024年01月25日
    浏览(49)
  • 好的FPGA编码风格(2)--多参考设计软件的语言模板(Language Templates)

            不论是Xilinx的Vivado,还是Altera的Quartus II,都为开发者提供了一系列Verilog、SystemVerilog、VHDL、TCL、原语、XDC约束等相关的语言模板(Language Templates)。         在Vivado软件中,按顺序点击Tools----Language Templates,即可打开设计模板界面。         在Quartus II软件中,

    2024年02月08日
    浏览(39)
  • C++进阶语法——STL 标准模板库(下)(Standard Template Library)【学习笔记(七)】

    1、迭代器 迭代器可以将任意的容器抽象成一个序列,可以使用迭代器遍历容器中的元素 迭代器设计的目的是为了解决容器与算法之间的耦合问题,与指针类似,可以通过迭代器访问容器中的元素 迭代器的声明方式为: 容器类型::iterator 变量名称 , 可以理解为一个普通的指

    2024年02月06日
    浏览(47)
  • 什么是好的FPGA编码风格?(2)--多参考设计软件的语言模板(Language Templates)

            不论是Xilinx的Vivado,还是Altera的Quartus II,都为开发者提供了一系列Verilog、SystemVerilog、VHDL、TCL、原语、XDC约束等相关的语言模板(Language Templates)。         在Vivado软件中,按顺序点击Tools----Language Templates,即可打开设计模板界面。         在Quartus II软件中,

    2024年02月05日
    浏览(41)
  • 【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?

    目录 1 - 非类型模板参数 2 - 模板的特化 2.1 - 概念 2.2 - 函数模板的特化 2.3 - 类模板的特化 2.3.1 - 全特化 2.3.2 - 偏特化 2.3.3 - 类模板特化应用实例 3 - 模板分离编译 3.1 - 什么是分离编译 3.2 - 模板的分离编译 3.3 - 解决方法 4 - 模板总结 模板参数分为类型形参与非类型形参。 类型

    2024年04月11日
    浏览(47)
  • 【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?

    目录 1 - 泛型编程 2 - 函数模板 2.1 - 函数模板概念 2.2 - 函数模板格式 2.3 - 函数模板的原理 2.4 - 函数模板的实例化 2.5 - 函数参数的匹配原则 3 - 类模板 3.1 - 类模板的定义格式 3.2 - 类模板的实例化 怎样实现一个通用的交换函数? 使用函数重载虽然可以实现,但是有几个不好的

    2024年02月20日
    浏览(37)
  • [C++历练之路]C++模板还能这么玩,已经走了好多弯路,后悔没有早点学会到。

    W...Y的主页 😊  代码仓库分享💕    🍔前言:  在C++的世界里,模板是一种强大而神奇的工具,宛如编程的瑰宝匣,蕴藏着无限的可能性。它们不仅能够让我们编写通用的代码,还能够在编译时实现类型安全的抽象。然而,模板的奥秘并非易见,它们像是编码世界中的魔法

    2024年02月04日
    浏览(40)
  • 浅谈WPF之控件模板Control Template和数据模板Data Template

    WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计,同时还推出了以模板为核心的新一代设计理念。在WPF中,通过引入模板,将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类:数据模板【Data Template】和控件模板【Control Template】 基本上,ControlT

    2024年02月03日
    浏览(35)
  • 模板匹配Template Matching

     实现代码: 运行结果:

    2024年02月11日
    浏览(45)
  • (二)模板templates

    Django模板层是为动态生成html服务的,非本文重点。前后端分离的设计更为常见,尽量少的涉及Django模板层内容。本文记录Django如何找到一个html文件。 在创建一个Django项目project后,目录下会生成一个同名目录和manage.py。创建一个app,并为app编写一个视图,如: 当通过路由访

    2024年01月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包