模板类与函数

 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 }

 

posted on 2026-01-27 14:00  海的寂寞  阅读(0)  评论(0)    收藏  举报

导航