Skip to content
On this page

CPP_模板


标签:CPP/基础  

模板函数

  • 一个模板只能作用于下面一个函数,若想定义新的函数,需要重新定义模板
  • 可以给定默认参数
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';
  }
}

Last updated: