C++模板怎么使用 函数模板与类模板语法
程序猿
•
•
好文分享 •
阅读 0
C++模板通过函数模板和类模板实现代码复用与类型安全,支持类型参数、非类型参数和模板模板参数,实例化在编译期进行,需注意定义可见性、代码膨胀、编译时间等问题。

C++模板这东西,说白了就是让你写代码的时候,能更通用、更灵活,不用为每一种数据类型都重写一套逻辑。它就像一个模具,你定义好形状,然后往里面灌不同的材料(数据类型),就能生产出针对不同类型的产品(函数或类)。核心思想就是代码复用和类型安全。它主要分两种:函数模板和类模板。
解决方案
要用C++模板,你得先理解它的基本语法和背后的“实例化”概念。
函数模板
想象一下,你写了一个函数,比如求两个数中的最大值,你可能想让它既能比较整数,又能比较浮点数,甚至自定义的类型。这时候,函数模板就派上用场了。
这里
就是一个类型参数,它代表一个占位符,编译器在实际使用时会根据你传入的参数类型来“推导”出
具体是什么。
比如,你这样用:
int i_max = max(10, 20); // 编译器推导出 T 是 intdouble d_max = max(3.14, 2.71); // 编译器推导出 T 是 doublestd::string s1 = "hello", s2 = "world";std::string s_max = max(s1, s2); // 编译器推导出 T 是 std::string,需要 string 支持 > 运算符
编译器会根据你传入的参数类型,自动生成一个
、
或
max(std::string, std::string)
的具体函数版本,这个过程就叫“模板实例化”。
你也可以显式地指定类型:
int i_max_explicit = max(5, 8);
这在某些编译器无法推导出类型,或者你希望强制转换类型时很有用。
类模板
类模板则允许你定义一个通用的类结构,比如一个栈、一个队列或者一个链表,它们的操作逻辑与存储的数据类型无关。
语法是这样:
template class MyStack {private: T* data; int top; int capacity;public: MyStack(int cap = 100) : capacity(cap), top(-1) { data = new T[capacity]; } ~MyStack() { delete[] data; } void push(T val) { if (top = 0) { return data[top--]; } // else: handle stack empty error return T(); // Return default-constructed T } bool isEmpty() const { return top == -1; }};
注意,类模板的成员函数如果在类外部定义,也需要加上模板头:
template void MyStack::push(T val) { if (top < capacity - 1) { data[++top] = val; }}
使用类模板时,你必须显式地指定类型参数:
MyStack intStack(50); // 创建一个存储 int 的栈intStack.push(10);int val = intStack.pop();MyStack stringStack; // 创建一个存储 std::string 的栈stringStack.push("Hello");stringStack.push("World");std::string s_val = stringStack.pop();
同样,编译器会根据
和
生成具体的类定义。