模板类具体化(特化、特例化)有两种:完全具体化和部分具体化。
语法请见示例程序。
具体化程度高的类优先于具体化程度低的类,具体化的类优先于没有具体化的类。
具体化的模板类,成员函数类外实现的代码应该放在源文件中。
在C++中,模板特化允许为模板类或模板函数提供特定类型的具体实现。这可以用于改变某些类型的特殊行为,或者优化特定数据类型的处理。模板特化分为两种:完全特化和部分特化。
完全特化
当为模板提供所有参数的具体类型时,称为完全特化。这意味着你为特定类型版本的模板提供了完整的实现。
部分特化
部分特化允许你指定模板的一部分参数,而其他参数仍然保持泛型。这对于处理类似但不完全相同的数据类型特别有用。
下面是一个示例,展示如何使用完全特化和部分特化:
#include <iostream>
#include <string>
// 基本模板定义
template <typename T>
class MyTemplate {
public:
void doSomething() {
std::cout << "General template" << std::endl;
}
};
// 完全特化对于 int 类型
template <>
class MyTemplate<int> {
public:
void doSomething() {
std::cout << "Specialized template for int" << std::endl;
}
};
// 部分特化对于指针类型
template <typename T>
class MyTemplate<T*> {
public:
void doSomething() {
std::cout << "Partially specialized template for pointers" << std::endl;
}
};
int main() {
MyTemplate<double> myDouble; // 使用通用模板
myDouble.doSomething();
MyTemplate<int> myInt; // 使用完全特化的模板
myInt.doSomething();
MyTemplate<int*> myIntPtr; // 使用部分特化的模板
myIntPtr.doSomething();
return 0;
}
代码解释:
- 基本模板定义了一个通用的行为,适用于所有未特化的类型。
- 完全特化为
int
类型提供了特定的实现。当模板用于int
类型时,将使用这个特化版本。 - 部分特化处理所有指针类型的情况。任何类型的指针(如
int*
,double*
等)都将使用这个部分特化的模板。
成员函数类外实现的注意点:
当模板类已具体化,且需要在类外定义成员函数时,通常将定义放在 .cpp
文件中或使用 inline
关键字直接在头文件中定义,以避免多重定义问题。
例如,对于完全特化的 int
类型:
// MyTemplate.h
template <>
class MyTemplate<int> {
public:
void doSomething();
};
// MyTemplate.cpp
#include "MyTemplate.h"
void MyTemplate<int>::doSomething() {
std::cout << "Specialized template for int" << std::endl;
}
这种方式确保了当多个源文件包含同一个头文件时,成员函数的实现只在一个源文件中定义,防止链接错误。不过,对于模板的部分特化或完全特化,通常推荐直接在头文件中使用 inline
定义,以简化项目结构并保持模板的典型使用方式(即在头文件中完全实现)。