C++学习笔记 21 模板STL

一、概念

java 或 C# 中叫泛型:generic,但是C++中叫templates,templatea则完全不同,也不能说完全不同,但是牛逼的多,比泛型和那些托管语言牛逼的多。模板有点像宏,它可以让你做很多事情,但是泛型却非常受制于类型系统,以及其他很多因素,模板templates要强大的多。模板是一个巨大、复杂的话题。

二、什么是模板?

模板允许你定义一个可以根据你的用途进行编译的模板,如果是有意义的话。你可以让编译器基于一套规则为你写代码。所谓模板,就是让编译器基于你给编译器的规则为你写代码。
例如:当我用模板写函数时,我实际上做的是,创建一个蓝本。所以当我调用这个参数时,我可以指定特定的参数,这个参数决定了放入到模板中的实际代码。这就决定了我如何使用这个函数。

  1. 未用模板示例:同样的代码重载多次
#include<iostream>
#include<string>

void Print(int a) {
	std::cout << a << std::endl;
}

void Print(float a) {
	std::cout << a << std::endl;
}

void Print(std::string a) {
	std::cout << a << std::endl;
}

int main() {
	Print(1);
	Print(2.0f);
	Print("Hello World");

	std::cin.get();
}
  1. 使用C++ 模板
#include<iostream>

template<typename T>
void Print(T a) {
	std::cout << a << std::endl;
}

int main() {
	Print(1);
	Print(2.0f);
	Print("Hello World");

	std::cin.get();
}

三、原理

如果你完全没有使用、调用模板函数,那么这个函数就不是真的存在,这个函数只是一个模板,只有当我们调用的时候,这个函数才被真正的创建,

eg:模板函数参数命名错误,Visual Studio编辑器并不会提示错误❌️,早期版本的Visual Studio 可build通过,新版本已不可通过

#include<iostream>

template<typename T>
void Print(T value) {
	std::cout << valu << std::endl;
}

模板只有在它被调用时,才会被创建,因为它只是一个模板,不是实际的代码。只有基于模板的使用情况,发送到编译器,进行编译后,才会具体化为真正的代码。

四、模板的更多用处

模板绝不仅仅局限于类型,也不局限于函数。你可以创建一个整个的类基于模。实际上,大量的C++标准模板库同样完全使用了模板,

不用类型做模板参数:

#include<iostream>

template<int N>
class Array {
private:
	int arr[N];

public:
	int GetSize() const {
		return N;
	}
};

int main() {
	Array<5> arr;
	arr.GetSize();
	std::cout << arr.GetSize() << std::endl;

	std::cin.get();
}

改进类型版,更进一步模板化

#include<iostream>

template<typename T, int N>
class Array {
private:
	T arr[N];

public:
	int GetSize() const {
		return N;
	}
};

int main() {
	Array<int, 5> arr;
	arr.GetSize();
	std::cout << arr.GetSize() << std::endl;

	std::cin.get();
}

这种方式和C++的元编程(meta programming)很像,因为你可以看到,相比于实际编程,编译器在编译时,实际在编程。

很多游戏工作室或软件公司 实际上禁止使用模板,从来不用模板,我觉得这可能反应过度了,因为我任务模板非常有用,在日志系统或其他的使用场景下,

posted @ 2025-12-17 10:57  超轶绝尘  阅读(0)  评论(0)    收藏  举报