【QT】模板如何使用

01函数模板

  • 定义:函数模板允许你编写一个通用的函数,该函数可以处理不同的数据类型,而不需要为每种类型都编写一个单独的函数。
  • 语法

cpp

template <typename T> T add(T a, T b) { return a + b; }

02说明

  • template <typename T>声明这是一个模板,typename关键字用于定义模板参数T,也可以使用class关键字,二者在这里含义相同。
  • 函数add接受两个类型为T的参数ab,并返回它们的和。T可以在函数定义中作为普通类型使用。

03使用

cpp

int main() { int result1 = add(3, 5); // 自动推导T为int double result2 = add(3.5, 5.5); // 自动推导T为double return 0; }
  • 显式实例化:有时编译器无法自动推导模板参数类型,或者你想明确指定类型,可以进行显式实例化。

cpp

int main() { int result = add<int>(3, 5); // 显式指定T为int return 0; }

001类模板

  • 定义:类模板用于创建通用的类,其成员函数和数据成员的类型可以是模板参数。
  • 语法

cpp

template <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的指针,用于存储栈中的元素。
  • 构造函数和析构函数分别负责分配和释放内存。pushpop成员函数用于操作栈。

003使用

cpp

int main() { Stack<int> intStack(5); intStack.push(10); int value = intStack.pop(); Stack<double> doubleStack(3); doubleStack.push(3.14); double dValue = doubleStack.pop(); return 0; }

0001模板特化

  • 函数模板特化
    • 定义:当通用的函数模板不能满足特定类型的需求时,可以对函数模板进行特化。
    • 语法

cpp

template <> std::string add<std::string>(std::string a, std::string b) { return a + b; }
  • 说明
    • template <>表示这是一个模板特化。
    • 对于std::string类型,add函数的行为是字符串拼接,不同于通用模板中数值类型的加法操作。
  • 类模板特化
    • 定义:同样,类模板也可以进行特化,以满足特定类型的特殊需求。
    • 语法

cpp

template <> class Stack<bool> { 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类型时可以采用更紧凑的存储方式等(这里为了简单示例,仅展示了基本结构)。
  1. 模板的局限性与注意事项
    • 模板实例化位置:模板定义通常放在头文件中,因为编译器需要在使用模板的地方知道模板的完整定义,以便进行实例化。
    • 错误检查延迟:模板的错误检查在实例化时进行,而不是在模板定义时。这意味着一些语法错误可能在代码编写时不会被立即发现,直到模板被实例化。
    • 模板膨胀:过多使用模板可能导致代码膨胀,因为编译器会为每个实例化的模板生成一份代码。在设计模板时,要尽量避免不必要的模板实例化。