Appearance
模板函数
- 一个模板只能作用于下面一个函数,若想定义新的函数,需要重新定义模板
- 可以给定默认参数
cpp
template <typename T>
//template <typename T = int>
T mySum(T a, T b) {
return a + b;
}
// template <typename T1, typename T2>
// T1 mySum(T1 a, T2 b) {}
int main() {
cout << mySum(1, 2) << endl; // 隐式调用,编译器自动推导类型
cout << mySum<double>(1.1, 22) << endl; // 显式调用,指定类型
cout << mySum('a', 'b') << endl;
cout << mySum(string("hello"), string("world"))
<< endl; // cosnt char * 没有 + 运算符,转 int
}- 可变参数:
cpp
template<typename... Args>
void print(const string_view fmt_str, Args&&... args) {}模板函数的特化
- 当基础模板和特化模板(重载的函数)同时出现时:
- 如果隐式调用,则是基础模板
- 如果显式调用,则是特化模板
- 所以一般开发中需要显式调用模板
模板类
- 模板类的调用,必须显式指定类型参数
- 类外定义需要重新定义模板
- 模板类一般不分文件编译,放入一个
hpp文件
cpp
template <typename T> class Node {
public:
T data;
Node<T> *next;
Node() : next(nullptr) {}
Node(T data) : data(data), next(nullptr) {}
// void show() { cout << "data = " << data << endl; }
void show();
};
// 在类外实现成员函数,需要重新声明一次模板
template <typename T> void Node<T>::show() {
cout << "data = " << data << endl;
}
int main() {
Node<int> n1(520);
n1.show();
Node<string> n2("hello");
n2.show();
}函数模板和类模板实现机制
- 二次编译,延时编译
- 当编译器第一次遇到函数模板,由于类型不确定,编译器先对类型部分之外的部分进行语法检查和语义分析,则会产生函数模板或类模板的内部实现机制
- 当第二次遇到时,编译器会根据参数传递的类型,检查语言和语言分析,如果无误,则产生函数和和类的原型
C++20 语法糖
- 可以在没有模板指定的时候使用
auto代替
cpp
template<typename C>
void printc(const C& c) {
for (auto i : c) {
std::cout << i << '\n';
}
}cpp
void printc(const auto& c) {
for (auto i : c) {
std::cout << i << '\n';
}
}