【C++重新认知】:泛型编程(模板编程)

一、什么是泛型编程

当我们设计函数或者类时,有时候需要对应不同数据类型编写相同的代码,这样的话不仅有代码冗余,而且更加的加大程序员开发事件,降低开发效率,因此泛型编程就是解决此类情况----不同的数据类型可以重用一个函数,或者可以创建不同数据类型的相同类。

二、泛型的声明

template <typename name ...>

样例:

#include <iostream>
using namespace std;

template <typename _Tp>
_Tp Max(_Tp a,_Tp b)
{
	return a > b ? a : b;
}

int main()
{
	cout << Max(1, 2) << endl; //传入两个整型
	cout << Max(10.55, 2.33) << endl;//传入两个浮点型
	return 0;
}

在这里插入图片描述

三、泛型的特性

1、显示和隐式传值
在这里插入图片描述
2、传常量
在这里插入图片描述
注意:当模板规定变量类型时调用的时候必须显示调用,并且传参只能传常量。
3、默认情况
在这里插入图片描述
4、普通函数和模板函数的优先级
在这里插入图片描述

可以看到普通函数的优先级是高于模板函数的

四、类模板

1、模板类样例

#include <iostream>
using namespace std;

template <typename _Ty1,typename _Ty2>
class Data
{
public :
	Data();
	Data(_Ty1 one, _Ty2 two):m_one(one),m_two(two){}
	~Data();

	void printData();
private:
	_Ty1 m_one;
	_Ty2 m_two;
};
//用到类型的地方必须使用 类名<类型> 的方式使用
template <typename _Ty1,typename _Ty2>
void Data<typename _Ty1, typename _Ty2>::printData()
{
	cout << m_one << "  " << m_two << endl;
}
int main()
{
	Data<int, string>* data = new Data<int, string>(1,"abc");//必须显示创建类对象
	data->printData();
	return 0;
}

template<typename _Ty1, typename _Ty2>
Data<_Ty1, _Ty2>::Data()
{
}

template<typename _Ty1, typename _Ty2>
Data<_Ty1, _Ty2>::~Data()
{
}

注意:模板类的定义和实现必须在一个文件中,**不能.h中实现类的定义在.cpp文件中实现类方法等。**模板类的声明必须显示创建
2、类模板的特化
当我们需要处理特殊数据时就需要类模板的特化(因为有些设备不一样,对于相同的数据要进行不同方法进行处理)

#include <iostream>
using namespace std;

template <typename _Ty1,typename _Ty2>
class Data
{
public :
	Data();
	Data(_Ty1 one, _Ty2 two):m_one(one),m_two(two)
	{
		cout << "这是原本模板类" << endl;
	}
	~Data();
private:
	_Ty1 m_one;
	_Ty2 m_two;
};

//完全特例
template <>
class Data<int,int>
{
public:
	Data(int one, int two) :m_one(one), m_two(two)
	{
		cout << "这是特例类" << endl;
	}
private:
	int m_one;
	int m_two;
};

int main()
{
	Data<int, int>* data1 = new Data<int, int>(1,1);
	Data<int, string>* data2 = new Data<int, string>(1,"abc");
	return 0;
}

在这里插入图片描述

五、可变模板

1、可变模板写法

template<typename ...Args>
void func(Args...args)
{
	.....
}

2、参数包的展开

  • 递归展开
#include <iostream>
using namespace std;

//递归终止函数
void func()
{
	cout << endl;
}

//展开函数
template <typename T,typename ...Args>
void func(T value,Args...args)
{
	cout<<value<< " ";//查看个数
	cout << sizeof...(args) << endl;
	func(args...);//最后参数包里面的个数为0时就匹配我们外边的func终止函数来结束递归展开
}

int main()
{	
	func(1, 2, 3);
	return 0;
}

在这里插入图片描述

  • 逗号表达式展开
#include <iostream>
using namespace std;

//展开函数
template <typename ...Args>
void func(Args...args)
{ 
	int arr[] = { args... };
	for(auto c:arr)
	{
		cout << c << " ";
	}
	cout << endl;
}

int main()
{	
	func(1,2,3,4);
	return 0;
}

相关推荐

  1. C++ 编程 模板

    2024-03-27 04:06:03       37 阅读
  2. C++ 模板编程详解

    2024-03-27 04:06:03       29 阅读
  3. C++模板编程编程的强大工具

    2024-03-27 04:06:03       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 04:06:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 04:06:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 04:06:03       87 阅读
  4. Python语言-面向对象

    2024-03-27 04:06:03       96 阅读

热门阅读

  1. 给wordpress添加自定义字段的分类筛选功能

    2024-03-27 04:06:03       42 阅读
  2. 【C++】每日一题,238 除自身以外数组的乘积

    2024-03-27 04:06:03       36 阅读
  3. [蓝桥杯 2019 省 B] 特别数的和

    2024-03-27 04:06:03       38 阅读
  4. StringRedisTemplate Autowired注入为空解决

    2024-03-27 04:06:03       39 阅读
  5. 20240325 大模型快讯

    2024-03-27 04:06:03       39 阅读
  6. ARM与X86架构的简单剖析与未来展望

    2024-03-27 04:06:03       38 阅读
  7. QT day5

    QT day5

    2024-03-27 04:06:03      34 阅读
  8. C++学习-2

    2024-03-27 04:06:03       36 阅读
  9. AI大模型学习的伦理与社会影响

    2024-03-27 04:06:03       41 阅读
  10. Flutter 获取系统是否是暗黑模式的方式

    2024-03-27 04:06:03       40 阅读