目录
函数模板
函数模板允许我们编写适用于多种数据类型的通用函数。以下是函数模板的定义和使用示例:
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
// 隐式实例化,T 被推断为 int
std::cout << max(3, 7) << std::endl;
// 显式实例化为 double 类型
std::cout << max<double>(3.5, 2.8) << std::endl;
}
类模板
类模板使得我们可以创建泛型类,适用于不同数据类型。类模板定义及使用示例:
template <typename T>
class Box {
public:
T contents;
void set(T item) { contents = item; }
T get() const { return contents; }
};
int main() {
Box<int> intBox;
intBox.set(42);
std::cout << intBox.get() << std::endl;
Box<std::string> stringBox;
stringBox.set("Hello");
std::cout << stringBox.get() << std::endl;
}
类模板成员函数的实例化
类模板的成员函数只有在被调用时才实例化。如果成员函数是虚函数,则会在编译期实例化所有可能的版本。
类模板的静态成员
静态成员在类模板的每个实例中都是独立的,例如:
template <typename T>
class MyClass {
public:
static T sharedValue;
};
// 在类外定义静态成员
template <typename T>
T MyClass<T>::sharedValue = T();
int main() {
MyClass<int> obj1;
MyClass<double> obj2;
obj1.sharedValue = 10;
obj2.sharedValue = 3.14;
std::cout << obj1.sharedValue << ", " << obj2.sharedValue << std::endl; // 输出: 10, 3.14
}
全局特化与成员特化
-
全局特化:针对特定类型完全特化模板。
template <> void max<char>(char a, char b) { return a > b ? a : b; }
成员特化:特化类模板中的某个成员函数。
template <> std::string Box<std::string>::get() const { return "Specialized get for string"; }
缺省模板参数与数值形式的模板参数
-
缺省模板参数允许在不提供某些类型参数时使用默认值。
1template <typename T = int> 2class DefaultTemplate { 3}; 4 5DefaultTemplate<> defaultInt; // 使用默认类型 int
-
数值形式的模板参数允许使用整数等作为模板参数。
template <typename T, size_t N = 80> class Array { T data[N]; }; Array<double, 100> largeArray; // 使用自定义大小
结论
函数模板和类模板是C++中泛型编程的核心,它们极大地增强了代码的复用性和灵活性。通过实例化,我们可以为不同数据类型生成定制化的函数和类,同时通过特化处理特殊情况,确保了泛型代码的适用范围和效率。理解模板的二次编译、隐式推断、重载规则以及特化技巧,对于高效地使用模板至关重要。
标签:函数,成员,实例,template,解析,模板,特化 From: https://blog.csdn.net/a_Loki/article/details/139808667