!!!!

写C++模板其实并不难,尤其是函数模板和类模板,是很多C++开发者进阶路上必须掌握的基础内容。如果你已经掌握了基本的C++语法,那么理解模板也就只是多加一层“通用性”的思维转换。

下面我们就从最实用的角度出发,讲讲函数模板和类模板的基本写法,适合刚入门或者想快速上手的人。

函数模板怎么写?
函数模板的核心作用是让一个函数支持多种类型,而不需要为每种类型都写一遍重复代码。
立即学习“C++免费学习笔记(深入)”;
基本语法结构如下:

template返回类型 函数名(参数列表) { // 函数体 }
举个简单例子,比如我们想写一个通用的“比较两个值大小”的函数:
templateT max(T a, T b) { return (a > b) ? a : b; }
这样你就可以用这个函数比较 int、double、甚至自定义类型的对象(前提是你重载了 > 运算符)。
几点注意事项:
-
typename也可以换成class,两者在这里没区别。 - 模板参数可以有多个,例如
template。 - 编译器会在调用时自动推导类型,你也可以手动指定类型,如
max。(3, 5)
类模板怎么写?
类模板的作用是让类本身也能处理不同类型的数据,常用于容器类,比如 vector、list 等。
基本结构如下:
templateclass 类名 { public: // 成员函数和变量 };
举个例子,我们写一个简单的动态数组类模板:
templateclass MyArray { private: T* data; int size; public: MyArray(int s) : size(s) { data = new T[size]; } ~MyArray() { delete[] data; } T& operator[](int index) { return data[index]; } };
使用的时候可以像这样:
MyArrayarr(10); arr[0] = 42;
需要注意的地方:
- 所有成员函数如果写在类外实现,必须带上模板声明。
- 类模板不能自动推导类型,必须显式指定,比如
MyArray。 - 如果你要把模板写到
.h和.cpp分开的文件中,得注意模板的实现通常要放在头文件里,否则链接会出错。
模板特化是什么?什么时候用?
有时候我们希望对某些特定类型做特殊处理,这时候就要用到模板特化。
例如,我们有个通用的打印函数模板:
templatevoid print(T value) { cout << value << endl; }
但如果我们想让 const char* 类型的输出更友好一点,可以特化它:
template <> void print(const char* value) { cout << "String: " << value << endl; }
特化适用于:
- 针对某种类型做优化
- 处理指针、引用等特殊情况
- 实现类似“判断类型是否支持某个操作”的功能(进阶)
小结一下
上面这些内容就是C++模板的基础写法,包括函数模板、类模板以及简单的模板特化。这部分内容看起来不复杂,但在实际项目中非常常用,尤其在写库或通用组件时特别重要。
基本上就这些了,记住:模板的本质是写出更通用的代码,而不是为了炫技。掌握好基础之后,再慢慢深入偏特化、模板元编程等内容也不迟。









