1 #include<iostream>
2
3 template <class T1,class T2>
4 class A
5 {
6 public:
7 T1 i;
8 T2 t;
9 A()
10 {
11 std::cout << "模板A类无参枸造" << std::endl;
12 }
13 A(T1 i,T2 t) :i(i),t(t)
14 {
15 std::cout << "模板A类->" << i +t<< std::endl;
16 }
17
18 void print()
19 {
20 std::cout << "模板A类print->" << i + t << std::endl;
21 }
22
23 void operator()(void)
24 {
25 std::cout << "模板A类()重载" << std::endl;
26 }
27 };
28
29 //一个普通函数 的返回值和形参 都为一个模板类 的具体化版本
30 //优先级别是最高
31 A<int,int>& func(A<int,int>& i) //A<int,int> 为模板类的实际类型
32 {
33 std::cout << "模板类 的具体化版本 ->"<< std::endl;
34 i.print();
35 return i;
36 }
37
38 //一个普通函数 的返回值和形参 都为一个模板类的完全板板化版本
39 //和定义一个模板函数一样 要把这个普通函数 添加一个和模板类一样的模板声时
40 //模板函数 关键字<typename>
41 //优先级次之
42 template <typename T1,typename T2>
43 A<T1, T2>& func(A<T1, T2>& i)
44 {
45 std::cout << "模板类 的模板化版本 ->" << std::endl;
46 i.print();
47 return i;
48 }
49
50 //这里实际可以把类看成一个对像 只需要一个模板参数就行了
51 //优先级最低 但是推荐用此版本 因为他灵活通用 不光可以调用类 还可以调用普通函数
52 template <typename T>
53 T& func(T& i)
54 {
55 std::cout << "模板类 的通用化版本 ->" << std::endl;
56 i();
57 return i;
58 }
59
60 void print()
61 {
62 std::cout << "普通函数PRINT" << std::endl;
63 }
64
65 int main()
66 {
67 //先创建一个A<INT> 对象
68 //这里调用具体化版本 优先级别是最高
69 A<int,int> a1(10,10);
70 func(a1);
71 //这里调用模板化版本 优先级次之 如果释掉 模板化定义 这里将会调用通用化版本 也说明通用化版本优先级别最低
72 A<char, char> a2(10, 10);
73 func(a2);
74
75 //这里将普通函数通过模板传送给FUNC
76 func(print);
77 return 0;
78 }