【QT】模板如何使用
01函数模板
- 定义:函数模板允许你编写一个通用的函数,该函数可以处理不同的数据类型,而不需要为每种类型都编写一个单独的函数。
- 语法:
cpp
template <typename T> T add(T a, T b) { return a + b; }02说明:
template <typename T>声明这是一个模板,typename关键字用于定义模板参数T,也可以使用class关键字,二者在这里含义相同。- 函数
add接受两个类型为T的参数a和b,并返回它们的和。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的指针,用于存储栈中的元素。 - 构造函数和析构函数分别负责分配和释放内存。
push和pop成员函数用于操作栈。
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类型时可以采用更紧凑的存储方式等(这里为了简单示例,仅展示了基本结构)。
- 这里对
- 模板的局限性与注意事项
- 模板实例化位置:模板定义通常放在头文件中,因为编译器需要在使用模板的地方知道模板的完整定义,以便进行实例化。
- 错误检查延迟:模板的错误检查在实例化时进行,而不是在模板定义时。这意味着一些语法错误可能在代码编写时不会被立即发现,直到模板被实例化。
- 模板膨胀:过多使用模板可能导致代码膨胀,因为编译器会为每个实例化的模板生成一份代码。在设计模板时,要尽量避免不必要的模板实例化。