在C++中,模板类是一种允许你编写通用类以处理各种数据类型的机制。通过使用模板类,你可以编写一次代码,然后使用不同的数据类型进行实例化,而无需为每种数据类型都编写一个新类。这有助于实现代码的重用和泛化。
一个实例:
#include <iostream>// 定义一个模板类
template <typename T>
class MyTemplateClass {
private:T data;public:// 构造函数MyTemplateClass(T value) : data(value) {}// 成员函数void display() {std::cout << "Data: " << data << std::endl;}
};int main() {// 使用模板类实例化不同类型的对象MyTemplateClass<int> intObj(42);MyTemplateClass<double> doubleObj(3.14);MyTemplateClass<std::string> stringObj("Hello, Templates!");// 调用成员函数intObj.display();doubleObj.display();stringObj.display();return 0;
}
另一个实例:
#include <iostream>
#include <string>// 定义一个模板类 YourClass,有一个纯虚函数 merge 接受可变数量的模板参数 T
template<typename... T>
class YourClass {
public:virtual void merge(T... args) = 0;
};// 定义一个模板类 ConcreteClass,继承自 YourClass,使用相同的模板参数 T
template<typename... T>
class ConcreteClass : public YourClass<T...> {
public:// 实现 YourClass 中的虚函数 mergevoid merge(T... args) override {std::cout << "Merging values: ";// 调用私有成员函数 printValues 处理参数包中的每个值printValues(args...);std::cout << std::endl;}private:// 递归地打印参数包中的每个值template<typename U, typename... Rest>void printValues(U first, Rest... rest) {std::cout << first << " ";// 递归调用 printValues 处理剩余的参数printValues(rest...);}// 基本情况:参数包为空时终止递归void printValues() {// 递归的终止条件,什么都不做}
};int main() {// 创建一个 ConcreteClass 的实例,模板参数为 int, double, std::stringConcreteClass<int, double, std::string> instance;// 调用 ConcreteClass 实例的 merge 函数,传递整数、浮点数和字符串作为参数instance.merge(42, 3.14, "Hello");return 0;
}