【QT】模板如何使用 📅 2026/6/30 23:49:38 01函数模板定义函数模板允许你编写一个通用的函数该函数可以处理不同的数据类型而不需要为每种类型都编写一个单独的函数。语法cpptemplate typename T T add(T a, T b) { return a b; }02说明template typename T声明这是一个模板typename关键字用于定义模板参数T也可以使用class关键字二者在这里含义相同。函数add接受两个类型为T的参数a和b并返回它们的和。T可以在函数定义中作为普通类型使用。03使用cppint main() { int result1 add(3, 5); // 自动推导T为int double result2 add(3.5, 5.5); // 自动推导T为double return 0; }显式实例化有时编译器无法自动推导模板参数类型或者你想明确指定类型可以进行显式实例化。cppint main() { int result addint(3, 5); // 显式指定T为int return 0; }001类模板定义类模板用于创建通用的类其成员函数和数据成员的类型可以是模板参数。语法cpptemplate typename T class Stack { private: T* data; int top; int capacity; public: Stack(int size) : capacity(size), top(-1) { data new T[capacity]; } ~Stack() { delete[] data; } void push(T value) { if (top capacity - 1) { // 处理栈满情况可扩容 return; } data[top] value; } T pop() { if (top -1) { // 处理栈空情况 return T(); } return data[top--]; } };002说明类模板Stack定义了一个栈结构其数据成员data是类型为T的指针用于存储栈中的元素。构造函数和析构函数分别负责分配和释放内存。push和pop成员函数用于操作栈。003使用cppint main() { Stackint intStack(5); intStack.push(10); int value intStack.pop(); Stackdouble doubleStack(3); doubleStack.push(3.14); double dValue doubleStack.pop(); return 0; }0001模板特化函数模板特化定义当通用的函数模板不能满足特定类型的需求时可以对函数模板进行特化。语法cpptemplate std::string addstd::string(std::string a, std::string b) { return a b; }说明template 表示这是一个模板特化。对于std::string类型add函数的行为是字符串拼接不同于通用模板中数值类型的加法操作。类模板特化定义同样类模板也可以进行特化以满足特定类型的特殊需求。语法cpptemplate class Stackbool { private: bool* data; int top; int capacity; public: Stack(int size) : capacity(size), top(-1) { data new bool[capacity]; } ~Stack() { delete[] data; } void push(bool value) { if (top capacity - 1) { // 处理栈满情况可扩容 return; } data[top] value; } bool pop() { if (top -1) { // 处理栈空情况 return false; } return data[top--]; } };说明这里对Stack类模板进行了特化专门处理bool类型。可以根据bool类型的特点对类的实现进行优化比如在存储bool类型时可以采用更紧凑的存储方式等这里为了简单示例仅展示了基本结构。模板的局限性与注意事项模板实例化位置模板定义通常放在头文件中因为编译器需要在使用模板的地方知道模板的完整定义以便进行实例化。错误检查延迟模板的错误检查在实例化时进行而不是在模板定义时。这意味着一些语法错误可能在代码编写时不会被立即发现直到模板被实例化。模板膨胀过多使用模板可能导致代码膨胀因为编译器会为每个实例化的模板生成一份代码。在设计模板时要尽量避免不必要的模板实例化。