C++ 模板
1、模板概念
模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。
模板分为模板函数和模板类。
2、typename 与 class
template <class T> // 采用 class 来声明模板
class {
};
template <typename T> // 采用 typename 来声明模板
class {
};
这两种一般来说 typename 用于内置类型,而 class 来声明类。但是 typename 也可以用作声
明类,而 class 也可以用来声明内置类型。
区别:当 T 是一个类的时候,并且这个类又有子类,应该用 typename // 未懂!
3、特化
特化分为两种:
- 全特化
- 函数模板只能用作全特化
- 偏特化
- 类模板可以用作偏特化
模板的全特化与偏特化都是建立在已定义的模板基础之上,不能够单独存在。
4、模板的分离编译
// fun.h
template <class T>
void fun(const T&);
// fun.cpp
#include "fun.h"
template <class T>
void fun(const T& t) {
std::cout << t << std::endl;
}
// main.cpp
#include <iostream>
#include "fun.h"
int main()
{
fun(3);
return 0;
}
这个代码在进行链接的时候会出现问题。原因是在代码编译的时候,由于 fun.cpp 中的 fun函数中没有参数,在实例化时无法生成代码。所以链接时 main.cpp 调用 fun 时,找不到函数 fun (int)实现的代码,所以链接错误。
解决方式:
将函数模板的定义放到头文件中
显式实例化,在 fun.cpp 中显式实例化模板函数。
template void fun<int> (const int&);
5、总结
优点:
- 模板复用了代码,节省资源。
- 增强了代码的灵活性。
缺点:
- 模板让代码变得凌乱,不易维护,编译代码的时间变长。
- 出错时错误信息十分凌乱,不容易定位。
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!