C++中模板支持泛型编程,通过template定义函数和类可处理多种类型。模板函数如max(T a, T b)实现类型自动推导,支持多参数如convert_and_print(T, U)进行类型转换。模板类如Array封装通用数据结构,支持类型与非类型参数。成员函数也可为模板,如Box::convert_to()实现值转换。模板需在头文件中定义以供编译时实例化,支持特化定制特定类型行为。掌握模板有助于理解STL并编写高效复用代码。

在C++中,模板是泛型编程的核心工具,它允许我们编写与数据类型无关的通用代码。通过模板类和模板函数,可以实现一套代码处理多种类型,提升复用性和灵活性。下面详细介绍模板类和模板函数的使用方法,并结合实用示例说明。
模板函数的基本用法
模板函数用于定义一个能接受多种类型的函数。使用template关键字声明模板参数,通常用T表示通用类型。
例如,实现一个通用的max函数:
templateT max(T a, T b) { return (a > b) ? a : b; }
调用时无需显式指定类型,编译器会自动推导:
立即学习“C++免费学习笔记(深入)”;
int x = max(3, 5); // T 推导为 int double y = max(2.5, 3.1); // T 推导为 double
也可以显式指定类型:
char c = max('a', 'z');
多个模板参数的函数
模板函数可以有多个类型参数。例如,实现一个打印并返回值的函数:
templateU convert_and_print(T input) { U result = static_cast(input); std::cout << "Converted " << input << " to " << result << std::endl; return result; }
使用示例:
convert_and_print(42); // int 转 double
模板类的基本用法
模板类用于定义通用的数据结构。比如实现一个简单的数组容器:
templateclass Array { private: T data[N]; public: T& operator[](int index) { return data[index]; } int size() const { return N; } };
这里T是类型参数,N是非类型模板参数(必须是编译时常量)。
实例化模板类:
ArrayintArray; Array doubleArray; intArray[0] = 100; std::cout << intArray[0] << std::endl; std::cout << "Size: " << intArray.size() << std::endl;
模板类中的成员函数模板
类本身是模板的情况下,其成员函数也可以是模板。例如:
templateclass Box { T value; public: Box(T v) : value(v) {} template auto convert_to() const { return static_cast (value); } };
使用方式:
Boxbox(100); double d = box.convert_to
常见注意事项
模板代码必须在头文件中定义,因为编译器需要在编译时看到完整的模板实现才能实例化。
模板不能分离声明和定义到.h与.cpp中(除非使用显式实例化)。
模板支持特化,即为特定类型提供定制实现:
template<> class Box{ // 为 bool 类型单独设计的实现 };
基本上就这些。掌握模板函数和模板类,就能写出高效、可复用的泛型代码。关键是理解类型推导机制和编译时实例化过程。实际开发中STL大量使用模板,理解它们有助于更好地使用标准库。











