
BIG ADD: - docker - archlinux FIX: - vim - c_cpp - string hash - linux /dev/random - thread - STL - linux - command - last OTHERS: - add antenna.md - mirrors - makefile.md
66 lines
1.5 KiB
Markdown
66 lines
1.5 KiB
Markdown
# 模板
|
||
|
||
## 目录
|
||
- [函数模板](#)
|
||
- [生成](#)
|
||
- [类模板](#)
|
||
- [完美转发](#)
|
||
- [可变参数](#可变参数)
|
||
|
||
## 函数模板
|
||
```cpp
|
||
template <typename T>
|
||
void swap(T &a, T &b);
|
||
```
|
||
__函数模板必须放在编译器可见的地方里,因为不是函数实体,只能算编译指令__
|
||
|
||
### 生成
|
||
**隐式实例化**
|
||
```cpp
|
||
int a=0, b=3;
|
||
swap<int>(a, b);
|
||
```
|
||
**显式实例化**
|
||
```cpp
|
||
template void swap<int>(int&, int&); // 使用模板生成int类型的函数定义
|
||
```
|
||
**显式具体化** 这个可以放到其他文件里,因为是有实体的
|
||
```cpp
|
||
template <> void swap<int>(int&, int&);
|
||
```
|
||
|
||
### 类型推导
|
||
+ decltype()
|
||
```cpp
|
||
int a;
|
||
decltype(a) var;
|
||
```
|
||
|
||
## 类模板
|
||
同样没有实体,包括类成员方法等都要写成模板的格式
|
||
|
||
## 完美转发
|
||
- [右值引用](./class.md#):有关完美转发的基础
|
||
完美转发允许模板函数将参数原封不动地转发给另一个函数,保留其左值或右值的性质。这在编写通用代码时非常有用,例如模板库或函数包装器
|
||
|
||
完美转发的核心是std::forward,它根据模板参数T的类型(左值引用或右值引用)来决定如何转发参数
|
||
|
||
```
|
||
template <typename T>
|
||
void wrapper(T&& arg) {
|
||
// 转发 arg 到另一个函数,保留其左值或右值性质
|
||
targetFunction(std::forward<T>(arg));
|
||
}
|
||
```
|
||
|
||
## 可变参数
|
||
|
||
```
|
||
void print() {} // 终止递归
|
||
template <typename T, typename... Types)
|
||
void print(const T& firstArg, const Types&... args) {
|
||
std::cout << firstArg << std::endl;
|
||
print(args...);
|
||
}
|
||
```
|