C++中的模板是一种强大的特性,它允许程序员编写与类型无关的代码。通过使用模板,可以编写在编译时根据所提供的类型自动生成特定版本的函数或类的代码。这大大提高了代码的重用性和灵活性。模板可以应用于函数(称为函数模板)和类(称为类模板)。
函数模板
函数模板允许你定义一个函数,该函数可以接受任何类型的参数,并且在编译时根据调用时的实际类型来生成函数的特定版本。
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
int main() {
int i = max<int>(7, 42); // 显式指定类型
double d = max(7.7, 42.2); // 编译器自动推导类型
return 0;
}
在这个例子中,max
是一个函数模板,它接受两个类型为 T
的参数,并返回它们的最大值。在 main
函数中,max
被用于 int
和 double
类型的参数,编译器会根据这些类型自动生成对应的函数版本。
类模板
类模板允许你定义一个类,该类的成员函数的返回类型、参数类型以及成员变量的类型都可以是模板参数。
template <typename T>
class Box {
public:
T value;
Box(T val) : value(val) {}
T getValue() {
return value;
}
void setValue(T val) {
value = val;
}
};
int main() {
Box<int> intBox(10);
Box<double> doubleBox(3.14);
std::cout << intBox.getValue() << std::endl;
std::cout << doubleBox.getValue() << std::endl;
return 0;
}
在这个例子中,Box
是一个类模板,它有一个类型为 T
的成员变量 value
和一些成员函数来操作这个变量。在 main
函数中,我们创建了 Box<int>
和 Box<double>
的实例,分别用于存储整数和浮点数。
模板特化
模板特化允许你为模板类或模板函数提供特定类型的实现。这在你需要对某些类型进行特殊处理时非常有用。
template <typename T>
class Storage {
public:
void store(T val) {
// 通用实现
}
};
// 特化 Storage 类以处理 char* 类型
template <>
class Storage<char*> {
public:
void store(char* val) {
// 特化处理字符串
}
};
模板偏特化
模板偏特化是模板特化的一种形式,它允许你对模板的部分模板参数进行特化,而保留其他模板参数的一般性。
总结
C++模板是一种强大的工具,它提高了代码的复用性和灵活性。通过使用模板,你可以编写与类型无关的代码,并在编译时根据实际需要自动生成特定版本的代码。函数模板和类模板是C++模板的两种主要形式,它们分别用于定义与类型无关的函数和类。模板特化和偏特化则提供了对模板的进一步定制能力。