Code
1//参考自:http://www.prglab.com/cms/pages/c-tutorial/advanced-concepts/templates.php
2
3#include <iostream.h>
4#include <stdio.h>
5
6//没有返回值的函数模板
7template <class T>void GetMax(T num1,T num2)
8{
9 T rtn=(num1>num2?num1:num2);
10 cout<<rtn<<endl;
11 //printf("%d \r\n",rtn);
12}
13
14//有返回值的函数模板
15template <class T>T GetMax(T num1,T num2)
16{
17 T rtn=(num1>num2?num1:num2);
18 return rtn;
19}
20
21//比较两个类型的值的大小
22template <class T,class U>void GetMax(T num1, U num2)
23{
24 T rtn=(num1>num2?num1:num2);
25 cout<<rtn<<endl;
26 //printf("%d \r\n",rtn);
27}
28
29//类模板
30template <class T>class sample
31{
32 T vlu1,vlu2;
33 public:
34 sample(T num1,T num2)
35 {
36 vlu1=num1;
37 vlu2=num2;
38 }
39 T GetMax()
40 {
41 T rtn;
42 rtn= vlu1>vlu2? vlu1: vlu2;
43 return rtn;
44 }
45}
46
47//--------------------------------------------------------
48/**//*
49模板的特殊化是当模板中的pattern有确定的类型时,模板有一个具体的实现。例如假设我们的类模板pair 包含一个取模计算(module operation)的函数,而我们希望这个函数只有当对象中存储的数据为整型(int)的时候才能工作,其他时候,我们需要这个函数总是返回0
50*/
51template <class T> class pair {
52
53 T value1, value2;
54
55public:
56 pair (T first, T second){
57 value1=first;
58 value2=second;
59 }
60 T module () {return 0;}
61};
62
63template <>class pair<int> {
64 int value1, value2;
65public:
66 pair (int first, int second){
67 value1=first;
68 value2=second;
69 }
70 int module ();
71};
72
73template <>int pair<int>::module() {
74 return value1%value2;
75}
76
77int main () {
78 pair<int> myints (100,75);
79 pair<float> myfloats(100.0,75.0);
80 cout<<myints.module()<< '\n';
81 cout<<myfloats.module()<< '\n';
82 return 0;
83
84}
85//--------------------------------------------------------
86/**//*
87由上面的代码可以看到,模板特殊化由以下格式定义:
88
89template <> class class_name <type>
90
91这个特殊化本身也是模板定义的一部分,因此,我们必须在该定义开头写template <>。而且因为它确实为一个具体类型的特殊定义,通用数据类型在这里不能够使用,所以第一对尖括号<> 内必须为空。在类名称后面,我们必须将这个特殊化中使用的具体数据类型写在尖括号<>中。
92
93当我们特殊化模板的一个数据类型的时候,同时还必须重新定义类的所有成员的特殊化实现(如果你仔细看上面的例子,会发现我们不得不在特殊化的定义中包含它自己的构造函数 constructor,虽然它与通用模板中的构造函数是一样的)。这样做的原因就是特殊化不会继承通用模板的任何一个成员。
94
95*/
1//参考自:http://www.prglab.com/cms/pages/c-tutorial/advanced-concepts/templates.php
2
3#include <iostream.h>
4#include <stdio.h>
5
6//没有返回值的函数模板
7template <class T>void GetMax(T num1,T num2)
8{
9 T rtn=(num1>num2?num1:num2);
10 cout<<rtn<<endl;
11 //printf("%d \r\n",rtn);
12}
13
14//有返回值的函数模板
15template <class T>T GetMax(T num1,T num2)
16{
17 T rtn=(num1>num2?num1:num2);
18 return rtn;
19}
20
21//比较两个类型的值的大小
22template <class T,class U>void GetMax(T num1, U num2)
23{
24 T rtn=(num1>num2?num1:num2);
25 cout<<rtn<<endl;
26 //printf("%d \r\n",rtn);
27}
28
29//类模板
30template <class T>class sample
31{
32 T vlu1,vlu2;
33 public:
34 sample(T num1,T num2)
35 {
36 vlu1=num1;
37 vlu2=num2;
38 }
39 T GetMax()
40 {
41 T rtn;
42 rtn= vlu1>vlu2? vlu1: vlu2;
43 return rtn;
44 }
45}
46
47//--------------------------------------------------------
48/**//*
49模板的特殊化是当模板中的pattern有确定的类型时,模板有一个具体的实现。例如假设我们的类模板pair 包含一个取模计算(module operation)的函数,而我们希望这个函数只有当对象中存储的数据为整型(int)的时候才能工作,其他时候,我们需要这个函数总是返回0
50*/
51template <class T> class pair {
52
53 T value1, value2;
54
55public:
56 pair (T first, T second){
57 value1=first;
58 value2=second;
59 }
60 T module () {return 0;}
61};
62
63template <>class pair<int> {
64 int value1, value2;
65public:
66 pair (int first, int second){
67 value1=first;
68 value2=second;
69 }
70 int module ();
71};
72
73template <>int pair<int>::module() {
74 return value1%value2;
75}
76
77int main () {
78 pair<int> myints (100,75);
79 pair<float> myfloats(100.0,75.0);
80 cout<<myints.module()<< '\n';
81 cout<<myfloats.module()<< '\n';
82 return 0;
83
84}
85//--------------------------------------------------------
86/**//*
87由上面的代码可以看到,模板特殊化由以下格式定义:
88
89template <> class class_name <type>
90
91这个特殊化本身也是模板定义的一部分,因此,我们必须在该定义开头写template <>。而且因为它确实为一个具体类型的特殊定义,通用数据类型在这里不能够使用,所以第一对尖括号<> 内必须为空。在类名称后面,我们必须将这个特殊化中使用的具体数据类型写在尖括号<>中。
92
93当我们特殊化模板的一个数据类型的时候,同时还必须重新定义类的所有成员的特殊化实现(如果你仔细看上面的例子,会发现我们不得不在特殊化的定义中包含它自己的构造函数 constructor,虽然它与通用模板中的构造函数是一样的)。这样做的原因就是特殊化不会继承通用模板的任何一个成员。
94
95*/