首页 > 编程语言 >C++模版

C++模版

时间:2024-09-20 11:50:42浏览次数:3  
标签:return int 模版 C++ 实例 template 类型

文章目录

一、函数模版

1、模版的语法

模版的关键字为template,后面跟<>尖括号,尖括号里面填类型,类型前面跟一个关键字typename,也可以用class
模版生成的函数就是逻辑一样,就是类型不一样

//template<typename T>
template<class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

在调用时根据不同类型编译器生成一个匹配该类型的函数

2、多个模版类型参数

对于需要不同类型模版也可以实现,需要定义多个参数类型

template<class T1,class T2>
void Swap(T1& x, T2& y)
{
	T1 tmp = x;
	x = y;
	y = tmp;
}

在针对不同类型时也可以使用强转让编译器知道要实例化什么类型的函数

  • 注意的是强转后的参数具有常性
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}

int main()
{
	int a = 1;
	double b = 3.3;
	std::cout << Add(a, (int)b) << std::endl;
	std::cout << Add((double)a, b) << std::endl;

	return 0;
}
3、模版的实力化

前面编译器自动推导后生成的函数是隐式实例化。
也可以由程序员控制让模版生成什么类型的函数来调用,称为显示实例化。

template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}

int main()
{
	int a = 1;
	double b = 3.3;

	//隐式实例化
	std::cout << Add(a, (int)b) << std::endl;
	std::cout << Add((double)a, b) << std::endl;

	//显示实例化
		std::cout << Add<int>(a, b) << std::endl;
	std::cout << Add<double>(a, b) << std::endl;

	return 0;
}
  • 在调用时用尖括号<>里面明确了T的类型

显示实例化主要用于编译器无法通过推导生成函数是需要指定类型实例化

template<typename T>
T* New(int n)
{
	return new T[n];
}

int main()
{
	int* p1 = New<int>(10);
	return 0;
}

二、类模版

1、using

c++中using可以替换typedef

typedef int STDATATYPE;
using STDATATYPE = int;

使用方式有差异,效果一样

2、类模版解决问题

之前创建栈用typedef来解决存储数据类型的问题,但如果存储了一个类型的数据,就不用用栈存储另一个类型的数据,栈不能进行同时存在多个类型数据进行存储。
所以还是用模版生成栈可以同时存在用来存储不同类型的数据。

template<class T>
class Stack
{
public:
	Stack(int n = 10)
	{
		_a = new T[n];
		_top = 0;
		_capacity = n;
	}

	~Stack()
	{
		delete[] _a;
		_top = 0;
		_capacity = 0;
	}
private:
	T* _a;
	int _top;
	int _capacity;
};
  • 当然类模版要显示实例化,没有传参的机会
int main()
{
	Stack<int> st1;

	Stack<double> st2;
	return 0;
}

标签:return,int,模版,C++,实例,template,类型
From: https://blog.csdn.net/2401_83305953/article/details/142366426

相关文章

  • C++类与对象(三)
    目录1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字2.STATIC成员2.1概念2.2特性3.C++中成员初始化的新玩法4.友元4.1友元函数4.2友元类5.内部类6.再次理解封装7.再次理解面向对象本次内容大纲:1.再谈构造函数1.1构造函数体赋值在......
  • C++扫盲--直接构造(Direct Initialization)
      在C++中,直接构造(DirectInitialization)是由一种对象构造的方式,它直接调用类的构造函数来初始化对象。这种方式通常用于创建对象时立即提供必要的参数。直接构造的语法如下:ClassNameobjectName(arguments);其中,ClassName是类的名称,objectName是要创建的对象的名称,argument......
  • C++20 模块化(Modules)
    C++20引入的模块化(Modules)是一个重大改进,旨在取代传统的头文件机制,提高编译速度、代码可维护性以及项目的可扩展性。模块化为C++提供了一种更现代化的代码组织方式,避免了头文件中常见的宏污染、重复编译和复杂的依赖管理问题。概念与背景在C++20之前,C++项目是通过头文......
  • VS(visual studio) C++ 封装dll,以及其隐式调用与显式调用(静态\动态)
    DLL介绍DLL(动态链接库,DynamicLinkLibrary)是一种可执行文件,它包含可以在其他程序中调用的函数和数据。他是Windows操作系统中的一个重要概念,用于代码共享和模块化。特点代码共享:多个程序可以同时使用同一个DLL文件,而不需要将其代码编译到每个程序中。这样可以节省磁盘空间和......
  • C++使用Win32GDI DC进行屏幕截图
    代码#include<windows.h>#include<Psapi.h>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<memory>#include<string>#include<thread>#......
  • 【C++】C++ STL探索:Priority Queue与仿函数的深入解析
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue这篇文......
  • C++ std::find函数 容器元素查找
    简介std::find函数是C++标准库内非常实用的一个函数,主要用于在给定范围内查找某个元素,如果找到该元素,则返回指向该元素的迭代器;如果没有找到,则返回指向范围末尾的迭代器(即 end() )。find函数原型std::find在头文件algorithm中template<classInputIt,classT>Inp......
  • C++ | 引用详解
    文章目录C++引用详解一、什么是引用二、引用的语法三、引用的特点1.必须初始化2.与原始对象具有相同的内存地址3.没有独立的存储空间4.传递参数高效四、引用的用途1.函数参数传递2.返回值3.用于实现运算符重载五、引用与指针的区别1.语法2.初始化3.空值4.操......
  • C++标准的一些特性记录:C++11的thread_local
    文章目录thread_localthread_local在多线程的编程环境里,一般来说,所有的线程都是共享同一个内存空间,也就是说如果定义一个变量,这个变量是被所有线程共享的,所以多个变量在访问同一个变量时,是需要加锁机制的,否则就会出现问题。在C++11中,引入了一个关键字thread_local......
  • C++代码编译过程
    代码转换成可执行文件的全过程看了一些网上的文章,觉的还是自己写写看看才能理解通透,也为找简历做准备。代码转换成可执行文件分为4个步骤,预处理、编译、汇编、链接。预处理这个过程是执行代码中的一些预处理指令,多说无益,直接上代码#include<iostream>#defineBesttrue;#i......