首页 > 编程语言 >C++ Template

C++ Template

时间:2023-08-20 16:57:53浏览次数:27  
标签:std cout void C++ Template print include data

Template

模板,其他语言叫泛型,或者说是泛型的爷爷的爷爷(

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

直接上例子

例一

先看这段代码:

#include<iostream>

void print(std::string data) {
	std::cout << data << std::endl;
};

int main() {
	print("Miku");
	return 0;
}

这是一个打印内容的函数,但是如果我们想要打印一个整数就不行了,因为需要的参数是string。这时候就有小伙伴说了,函数重载啊。确实可以,下面是函数重载的代码:

#include<iostream>

void print(std::string data) {
	std::cout << data << std::endl;
};

void print(int data) {
	std::cout << data << std::endl;
};
int main() {
	print("Miku");
	print(39);
	return 0;
}

没任何问题,如果我们还需要对浮点数支持,代码就会变成下面这样:

#include<iostream>

void print(std::string data) {
	std::cout << data << std::endl;
};

void print(int data) {
	std::cout << data << std::endl;
};

void print(float data) {
	std::cout << data << std::endl;
};

void print(double data) {
	std::cout << data << std::endl;
};

int main() {
	print("Miku");
	print(39);
	print(39.0);
	return 0;
}

那如果还有更多的数据类型需要支持呢?就需要很多很多的重载函数。假如我们需要修改输出格式,我们就需要修改每一个重载函数。如:

#include<iostream>

void print(std::string data) {
	std::cout << "Log:" << data << std::endl;
};

void print(int data) {
	std::cout << "Log:" << data << std::endl;
};

void print(float data) {
	std::cout << "Log:" << data << std::endl;
};

void print(double data) {
	std::cout << "Log:" << data << std::endl;
};

int main() {
	print("Miku");
	print(39);
	print(39.0);
	return 0;
}

这个时候template就排上用场了(注意不仅仅这一个用途,后面还会说),我们的代码可以写成这样:

#include<iostream>

template <typename T> void print(T data) {
	std::cout << "Log:" << data << std::endl;
};

int main() {
	print("Miku");
	print(39);
	print(39.0);
	return 0;
}

这里将print函数定义为模板,typename T表示有一个类型T,T是什么还不知道。我们在实际调用的时候,传了什么类型,T就是什么类型(这里的typename也可以写成class,但是没typename直观)。

编译器在编译到 print("Miku");时,就为我们写了一段代码:

void print(std::string data) {
	std::cout << "Log:" << data << std::endl;
};

然后 print("Miku");就可以正常使用了。

当然我们也可以指定print的类型:

#include<iostream>

template <typename T> void print(T data) {
	std::cout << "Log:" << data << std::endl;
};

int main() {
	print("Miku");
	print(39);
	print <double> (39.0);
	return 0;
}

print <double> (39.0); 指定了 Tdouble

例二

上面 print <double> (39.0);这种格式有没有很眼熟?我们在使用C++的 array 时,也有类似的表述:array<类型,长度> 变量名。我在这里复刻一下 array 类:

#include<iostream>

template <typename T> void print(T data) {
	std::cout << "Log:" << data << std::endl;
};

template <class T, int N> class array {
private:
	T arr[N];
public:
	int size() {
		return N;
	}
};

int main() {
	print("Miku");
	print(39);
	print <double> (39.0);
	array<std::string, 10> strArr;
	std::cout << strArr.size() << std::endl;
	return 0;
}

当然我没有实现array类的各种功能,只是说明了一下template在这里的用途。不仅仅可以有typename(or class),也可以有别的类型。

这只是冰山一角,未完待续...(后续也会更新到这篇文章里)

标签:std,cout,void,C++,Template,print,include,data
From: https://www.cnblogs.com/orzmiku/p/17644233.html

相关文章

  • C++ 可见性
    可见性比较简单,很好理解,长话短说=v=外部的类派生类同一个类private不可访问不可访问可以访问protected不可访问可以访问可以访问public可以访问可以访问可以访问#include<iostream>usingnamespacestd;classA{private: intx;protected......
  • C++ 成员初始化列表
    成员初始化列表成员初始化列表时对象初始化成员变量的一种方法。使用方式如下(两种书写习惯)ClassName(args):varName1(value),...,varNameN(value){//这是一个构造函数//...CODE...}ClassName(args):varName1(value),...,varNameN(value){//这......
  • C++ const和mutable
    const和mutable这里只说const在c++中的特殊用法。用const修饰函数的成员函数。被const修饰的成员函数无法修改函数内的其他成员。可以认为这个函数变成了一个“只读”的状态。Likethis://注意const在括号后面,不要写成constxxxxx(){...}了intgetStatus()const{ returnm......
  • C++ new和delete
    new关键字在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 隐式转换与explicit关键字
    隐式转换与explicit关键字隐式转换函数构造的隐式转换,直接上代码:#include<bits/stdc++.h>classEntity{private: std::stringm_Name; intm_Age;public: Entity(conststd::string&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("Unknown"),m_A......
  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......
  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • C++ 链接库
    C++中使用库分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。以下操作均在VisualStudio2022中进行,以32位GLFW为例子(glfw.org)。首先下载glfw32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后......
  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......