模板的特化

模板分为类模板和函数模板,特化分为全特化和偏特化(特化是对模板的特化,因此必须存在模板才可以进行特化)

  • 全特化:给模板中的所有模板参数指定一个具体的类
  • 偏特化:部分指定模板参数的类
  • 类模板可以全特化也可以偏特化
  • 函数模板只能全特化(因为重载可以达到偏特化的效果)

类:

 1 template<typename T1, typename T2>  
 2 class Test  
 3 {  
 4 public:  
 5     Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;}  
 6 private:  
 7     T1 a;  
 8     T2 b;  
 9 };  
10   
11 template<>  
12 class Test<int , char>  
13 {  
14 public:  
15     Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;}  
16 private:  
17     int a;  
18     char b;  
19 };  
20   
21 template <typename T2>  
22 class Test<char, T2>  
23 {  
24 public:  
25     Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;}  
26 private:  
27     char a;  
28     T2 b;  
29 };  

函数:

 1 //模板函数  
 2 template<typename T1, typename T2>  
 3 void fun(T1 a , T2 b)  
 4 {  
 5     cout<<"模板函数"<<endl;  
 6 }  
 7   
 8 //全特化  
 9 template<>  
10 void fun<int ,char >(int a, char b)  
11 {  
12     cout<<"全特化"<<endl;  
13 }  
14   
15 //函数不存在偏特化:下面的代码是错误的  
16 /* 
17 template<typename T2> 
18 void fun<char,T2>(char a, T2 b) 
19 { 
20     cout<<"偏特化"<<endl; 
21 } 
22 */  

 

转载于:https://www.cnblogs.com/mrlsx/p/5862755.html

### C++ 模板特化的概念与用法 #### 什么是模板特化模板特化是指针对某些特定类型的模板提供专门的实现。它允许开发者为某个具体的类型定义不同的逻辑,而不是依赖于泛型版本的行为[^4]。 --- #### 函数模板特化 函数模板特化是对某一特定类型重新定义其行为的方式。以下是一个简单的例子: ```cpp // 泛型版本 template<typename T> T max(T a, T b) { return (a > b) ? a : b; } // 特化版本:对于 int 类型 template<> int max<int>(int a, int b) { return (a > b) ? a : b; } ``` 上述代码展示了如何为 `max` 函数创建一个专用于 `int` 的特化版本[^2]。 --- #### 类模板特化 类模板特化则是为某一种或多种类型定制类的功能。以下是通过类模板特化的示例: ```cpp // 基础模板 template<typename T> struct Less { bool operator()(const T& x, const T& y) const { return x < y; } }; // 针对指针类型的特化 template<> struct Less<Date*> { bool operator()(Date* x, Date* y) const { return *x < *y; } }; ``` 此代码片段展示了一个比较器类模板及其针对指针类型的特化版本[^1]。 --- #### 完整示例:类模板特化应用 以下是一段完整的程序,演示了类模板特化的作用: ```cpp #include <iostream> using namespace std; // 泛型模板 template<typename T> class MyClass { public: void print() { cout << "Generic version" << endl; } }; // 特化模板针对 double 类型 template<> class MyClass<double> { public: void print() { cout << "Specialized version for double" << endl; } }; int main() { MyClass<int> objInt; MyClass<double> objDouble; objInt.print(); // 输出 Generic version objDouble.print(); // 输出 Specialized version for double return 0; } ``` 在此示例中,`MyClass` 被设计成支持不同类型的对象打印功能,并且提供了针对 `double` 类型的特殊处理。 --- #### 偏特化(Partial Specialization) 除了全特化外,还可以使用偏特化来覆盖部分匹配的情况。例如: ```cpp // 泛型模板 template<typename T1, typename T2> class MyTemplate { public: void showType() { cout << "General template" << endl; } }; // 偏特化:当第二个参数固定为 int 时 template<typename T1> class MyTemplate<T1, int> { public: void showType() { cout << "Partially specialized with second parameter as int" << endl; } }; int main() { MyTemplate<float, char> genericObj; MyTemplate<float, int> partialSpecObj; genericObj.showType(); // 输出 General template partialSpecObj.showType(); // 输出 Partially specialized... return 0; } ``` 这段代码显示了如何利用偏特化技术指定更精确的模板行为[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值