模板的全特化与偏特化

转载 2017年01月03日 11:34:41

模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。

模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。

先看类模板:

[cpp] view plain copy
  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. };  

那么下面3句依次调用类模板、全特化与偏特化:

[cpp] view plain copy
  1. Test<double , double> t1(0.1,0.2);  
  2. Test<int , char> t2(1,'A');  
  3. Test<charbool> t3('A',true);  

而对于函数模板,却只有全特化,不能偏特化:

[cpp] view plain copy
  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. */  

至于为什么函数不能偏特化,似乎不是因为语言实现不了,而是因为偏特化的功能可以通过函数的重载完成。

C++ 模板全特化和偏特化

1. 模板特化按对象类型(类和全局函数)分为两种: 类模板的特化和 全局模板函数的特化; 2. 按特化的类型分全特化和偏特化(也就是多个模板参数可以选定只 特化一个或者多个),全局模板函数的特化不支持...
  • hzhxxx
  • hzhxxx
  • 2015年12月03日 09:30
  • 2275

C++ — 全特化和偏特化

全特化和偏特化
  • Dawn_sf
  • Dawn_sf
  • 2017年05月04日 16:31
  • 1149

函数模板全特化与偏特化

template class Test { public: Test(T1 i,T2 j):a(i),b(j){cout private: T1 a; T2 b; }; template clas...
  • s983134950
  • s983134950
  • 2015年04月21日 11:00
  • 770

类模板的全特化和偏特化

#include #include template class A { public: A(T1 self_str1,T2 self_str2) { printf("类模板:\n"); ...
  • crazyacm
  • crazyacm
  • 2016年09月21日 16:29
  • 449

c++学习(模板特化和偏特化)

模板特化和偏特化作者:谢宝陵  周 生(合肥市炮兵学院计算中心 230031)摘要:本文通过例子介绍了在 C++标准库中广泛使用的模板特化和偏特化,并指出了模板特化和偏特化的定义规则和应用规则。关键词...
  • zhang810413
  • zhang810413
  • 2007年12月18日 22:26
  • 12251

模板的全特化与偏特化

模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。 模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是...
  • u010984552
  • u010984552
  • 2016年09月17日 15:35
  • 106

C++模板之特化与偏特化详解

前言 说到C++模板,这个已经不是什么新东西了,自己在实际开发中也用过;对于C++模板特化和偏特化,对于别人来说,已经不是什么新东西了,但是对于我来说,的确是我的盲区,那天在群里讨论这个问题,自己对...
  • ywcpig
  • ywcpig
  • 2016年09月14日 18:51
  • 755

C++中模板的特化与偏特化

1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现。目前,STL在C++社区中得到了广泛的关注、应用和研究。...
  • gao1440156051
  • gao1440156051
  • 2016年05月31日 23:10
  • 913

为什么不要特化函数模版?

函数模版的全特化版本不参与函数重载解析,并且优先级低于函数基础模版参与匹配的原因是:C++标准委员会认为如果因为程序员随意写了一个函数模版的全特化版本,而使得原先的重载函数模板匹配结果发生改变(也就是...
  • magictong
  • magictong
  • 2015年09月19日 11:30
  • 4300

重学C++ (十二) 模板特化和偏特化

一、模板的定义 1.类模板 template class T> class compare { public: bool IsEqual(T t1, T t2) { ...
  • jiange_zh
  • jiange_zh
  • 2016年03月03日 22:54
  • 2064
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模板的全特化与偏特化
举报原因:
原因补充:

(最多只允许输入30个字)