C++模板编程 - 第三章 类模板

模板类 template<typename T> stack {...} 的构造函数应该写作stack而不是stack<T>,经作者这么一说我在注意到这件事情。

模板的特化

先说说函数模板。函数模板只能全特化,不能偏特化,并且特化的模板函数相比于等价模板函数优先,但是和非模板函数相比非模板函数优先。

 1 #include<iostream>
 2
 3 using std::cout;
 4 using std::endl;
 5
 6 // version 1
 7 int max(int a, int b)
 8 {
 9     cout << "int max(int, int) is called." << endl;
10     return a > b ? a : b;
11 }
12
13 // version 2
14 template<typename T>
15 T max(const T & a, const T & b)
16 {
17     cout << "template<typename T> T max(const T &, const T &) is called." << endl;
18     return a > b ? a : b;
19 }
20
21 // version 3
22 template<>
23 int max(const int & a, const int & b)
24 {
25     cout << "template<> int max(const int &, const int &)is called." << endl;
26     return a > b ? a : b;
27 }
28
29 int main()
30 {
31     cout << max(1, 2) << endl;        // version 1 is called
32     cout << max<>(1, 2) << endl;    // version 3 is called
33     cout << max(1.0, 2.0) << endl;    // version 2 is called
34     return 0;
35 }

类模板的局部特化

 1 #include<iostream>
 2
 3 using std::cout;
 4 using std::endl;
 5
 6 // version 0
 7 template<typename T1, typename T2> class SomeClass
 8 {
 9 public:
10     SomeClass()
11     {
12         cout << "version 0" << endl;
13     }
14 };
15
16 // version 1
17 template<typename T> class SomeClass < T, T >
18 {
19 public:
20     SomeClass()
21     {
22         cout << "version 1" << endl;
23     }
24 };
25
26 // version 2
27 template<typename T> class SomeClass < T, int >
28 {
29 public:
30     SomeClass()
31     {
32         cout << "version 2" << endl;
33     }
34 };
35
36 // version 3
37 template<typename T1, typename T2> class SomeClass < T1*, T2* >
38 {
39 public:
40     SomeClass()
41     {
42         cout << "version 3" << endl;
43     }
44 };
45
46 // version 4
47 template<typename T> class SomeClass < T*, T* >
48 {
49 public:
50     SomeClass()
51     {
52         cout << "version 4" << endl;
53     }
54 };
55
56
57 int main()
58 {
59 //    SomeClass<int, int> FirstClass;       // Oooooops! This one matches BOTH 2 and 3 -- CONFUSING
60     SomeClass<float*, int*> SecondClass;    // version 3
61     SomeClass<int*, int*> ThirdClass;       // version 4 -- WITHOUT version 4, this is an error! -- CONFUSING
62     SomeClass<int, char> ForthClass;        // version 0
63     SomeClass<char, int> FifthClass;        // version 2
64     SomeClass<double, double> FixthClass;   // version 1
65 }

所以类模板partial specification有点反直觉的地方。

还有没说到的一点是:可以为类模板参数定义默认值,这些值还可以引用之前的模板参数。

滚去看电动力学@[email protected]

时间: 2024-10-17 23:36:15

C++模板编程 - 第三章 类模板的相关文章

第2章 类模板:2.1 类模板Stack的实现

Chapter 2: Class Templates 第2章 类模板 Similar to functions, classes can also be parameterized with one or more types. Container classes, which are used to manage elements of a certain type, are a typical example of this feature. By using class templates

《UML精粹》第三章 -类图的基本概念

第三章 类图:基本概念 类图可用来描述系统中各种对象的类型,也可描绘出对象间各种各样的静态关系.此外,类图中也可以秀出类的性质(property)与操作(operation),以及可应用到对象间连接方式的一些限制(constraint).在UML中,我们用特性(feature)来代表累的性质与操作这两种概念. 1.性质 性质代表类的结构特性(structural feature).虽然只是一个概念,不过它却可以用两种非常不同的表示法来呈现:属性与关联. 2.属性 属性(attributes)表示

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

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

第三章:模板扩展

在第二章中,我们看到了Tornado模板系统如何简单地传递信息给网页,使你在插入动态数据时保持网页标记的整洁.然而,大多数站点希望复用像header.footer和布局网格这样的内容.在这一章中,我们将看到如何使用扩展Tornado模板或UI模块完成这一工作. 3.1 块和替换 当你花时间为你的Web应用建立和制定模板时,希望像你的后端Python代码一样重用你的前端代码似乎只是合逻辑的,不是吗?幸运的是,Tornado可以让你做到这一点.Tornado通过extends和block语句支持模板

C++模板编程 - 第四章 非类型模板参数

一个例子是 1 template<typename T, int MAXSIZE> 2 class Stack {}; 在这里我就想起了C语言是怎么弄数据结构的,不得不说模板是很方便的东西.上面的例子是一个类模板,函数模板其实也是类似的. 浮点数和类对象是不允许作为非类型模板参数的. 对上面这句话的补充:这是历史原因,C++ Templates的作者认为C++在未来可能会允许使用浮点数和类对象作为非类型模板参数. 不太好理解的是这个例子 1 template<char const * n

C++模板编程 - 第五章 技巧性基础知识

Keyword Typename 1 template<typename T> 2 class SomeClass 3 { 4 typename T::subtype * ptr; 5 }; 如果没有typename,T::subtype会被认为是一个静态成员. A practical example: 1 // print elements in a STL container 2 template<typename T> 3 void print(T const & c

C++模板编程 - 第六章 模板实战

关于源代码的组织:函数模板在实例化的时候编译器要能够看到其定义——这一点是要注意的. 包含模型 将模板的声明和定义都放到头文件中,不过这样带来的问题是增加了include的开销. 显示实例化 感觉这个东东比较鸡肋. 分离模型 export关键字 使用export关键字之后即使模板的声明和定义在不同的编译单元中,模板也可以正常使用.不过,就像作者所说的,这个关键字支持还不多,坑也不少T_T

C++模板编程 - 第七章 模板术语

Template Class or Class Template Class template is a TEMPLATE used to generate classes. Template class is a classed generated from a template. Sometimes people also used it as the synonym of class template. Instantiation and Specialization Instantiat