模板的全特化与偏特化

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

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

先看类模板:

[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. template<>
  11. class Test<int , char>
  12. {
  13. public:
  14. Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;}
  15. private:
  16. int a;
  17. char b;
  18. };
  19. template <typename T2>
  20. class Test<char, T2>
  21. {
  22. public:
  23. Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;}
  24. private:
  25. char a;
  26. T2 b;
  27. };

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

[cpp] view plain copy

  1. Test<double , double> t1(0.1,0.2);
  2. Test<int , char> t2(1,‘A‘);
  3. Test<char, bool> 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. template<>
  9. void fun<int ,char >(int a, char b)
  10. {
  11. cout<<"全特化"<<endl;
  12. }
  13. //函数不存在偏特化:下面的代码是错误的
  14. /*
  15. template<typename T2>
  16. void fun<char,T2>(char a, T2 b)
  17. {
  18. cout<<"偏特化"<<endl;
  19. }
  20. */

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

转自:http://blog.csdn.net/thefutureisour/article/details/7964682/

C++ 模板全特化中的函数特化

[cpp] view plain copy

print?

  1. #include <iostream>
  2. using namespace std;
  3. template<typename T>
  4. bool isLess(T x, T y) {
  5. cout << "general version\n";
  6. return x < y;
  7. }
  8. template<>
  9. bool isLess<int*>(int* x, int* y) {
  10. cout << "specialization version\n";
  11. return *x < *y;
  12. }
  13. int main() {
  14. int n = 9, m = 3;
  15. cout << isLess(n, m) << endl;这个是匹配是int类型的模板类
  16. cout << isLess(&n, &m) << endl;//这个是匹配的模板类中的指针类型,因为我们已经替编译器实现啦指针类型,所有他就用我们的实现的啦,就不自己创建啦
  17. }

一旦为某个模板做了特化,编译器将不会再为该特化所涉及的类型生成对应的实例化
 特化目的是为了解决通用模板不能精确解决的问题
 模板的特化版本依赖于通用模板,通用模板必须在所有特化模板之前声明(定义)

转自:http://blog.csdn.net/rain_qingtian/article/details/15815251

时间: 2024-10-20 23:40:41

模板的全特化与偏特化的相关文章

模板类的全特化、偏特化

我们先来定义一个普通的模板类 1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板类" << endl; } 5 }; 我们再来调用一下: 1 int main() 2 { 3 Test<char> t1; 4 Test<int> t2; 5 Test<int *> t3; 6 return 0; 7 } 输出的结果1: 模板类 模板类 模板类 如果

模板全特化与偏特化

特化分为全特化与偏特化,全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分.本质上,偏特化模板的匹配和选择过程与重载解析非常类似.实际上,在非常复杂的偏特化情况下,编译器可能就是将偏特化直接译成函数,然后直接调用重载解析来处理.重载解析和偏特化匹配都用到了模板参数推导. 例如c++标准库中的类vector的定义 template <class T, class Allocator> class vector { // … // }; template 

C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

1.  主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template<class T1, class T2> 5 class A{ 6 public: 7 void function(T1 value1, T2 value2){ 8 cout<<"value1 = "<<value1<<endl; 9 cou

[转]C++中模板的特化与偏特化

转载自:http://hi.baidu.com/klcdyx2008/blog/item/5adbf77b79f316f90bd1873c.html 1.引言C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理解和掌握模板是学习.应用和研究以及扩充STL的基础.而STL模板实例中又充斥着大量的模板特化和偏特化. 2.模板的定义(1) 类模板定义一个栈的类模板,

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

最近在看STL的过程中,发现自己对于模板这里的知识有所生疏,因此今日将这部分内容再做整理,以备后忘. 关于C++模板的概念这里不再赘述,默认读者已经具备基础知识. 模板的特化 先看一段代码: #include <iostream> using namespace std;   template <class T> class TClass { public:      bool Equal(const T& arg, const T& arg1); };   tem

C++模板特化与偏特化

C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然不利于程序的扩充和维护.C++模板就应运而生.C++的模板提供了对逻辑结构相同的数据对象通用行为的定义.这些模板运算对象的类型不是实际的数据类型,而是一种参数化的类型.C++中的模板分为类模板和函数模板. 类模板如下: #include <iostream>using namespace std;

模版的特化和偏特化

模版的特化与偏特化 模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分. Partial Template Specialization能够让你在模板(Template)的所有可能的实体中特化出一组子集. 1.模板的特化(template specialization): 例如,定义如下的一个模板: temp

模版的完全特化与偏特化

模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分. 模版特化:任何针对模版参数进一步进行条件限制设计的特化版本. <<泛型思维>> 完全特化:针对所有的模版参数进行特化. <<c++ primer>> 类模板: template<class T,class N&g

模版的特化与偏特化

Partial Template Specialization能够让你在模板(Template)的所有可能的实体中特化出一组子集. 1.模板的特化(template specialization):    例如,定义如下的一个模板: template<class Window, class Controller> class Widget { ... 泛化实现代码 ... }; 然后你可以像下面那样明确地加以特化: template<> //注意:template后面的尖括号中不带