深入理解函数模板:

注意事项:

 

示例:

两个指针打印了不同的值,这说明编译器根据函数模板产生了两个具体的函数。

添加一个新类型:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Test
 7 {
 8     Test(const Test&);
 9 public:
10     Test()
11     {
12     }
13 };
14 
15 template < typename T >
16 void Swap(T& a, T& b)
17 {
18     T c = a;
19     a = b;
20     b = c;
21 }
22 
23 typedef void(FuncI)(int&, int&);
24 typedef void(FuncD)(double&, double&);
25 typedef void(FuncT)(Test&, Test&);
26 
27 int main()
28 {
29     FuncI* pi = Swap;    // 编译器自动推导 T 为 int
30     FuncD* pd = Swap;    // 编译器自动推导 T 为 double
31      FuncT* pt = Swap;    // 编译器自动推导 T 为 Test
32     
33     cout << "pi = " << reinterpret_cast<void*>(pi) << endl;
34     cout << "pd = " << reinterpret_cast<void*>(pd) << endl;
35      cout << "pt = " << reinterpret_cast<void*>(pt) << endl;
36     
37     return 0;
38 }

 结果如下:

我们将类的拷贝构造函数定义成私有的,编译器检测出了错误。

 我们的模板是没有问题的,编译器在进行第一次编译时没有错误,并且产生一个参数类型为Test的函数。

在第二次编译时检测出18行的拷贝构造的错误,进一步给出类中的错误。

 

多参数函数模板:

 

 

示例:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 template 
 7 < typename T1, typename T2, typename T3 >
 8 T1 Add(T2 a, T3 b)
 9 {
10     return static_cast<T1>(a + b);
11 }
12 
13 
14 int main()
15 {
16     // T1 = int, T2 = double, T3 = double
17     int r1 = Add<int>(0.5, 0.8);
18 
19     // T1 = double, T2 = float, T3 = double
20     double r2 = Add<double, float>(0.5, 0.8);
21 
22     // T1 = float, T2 = float, T3 = float
23     float r3 = Add<float, float, float>(0.5, 0.8);
24 
25     cout << "r1 = " << r1 << endl;     // r1 = 1
26     cout << "r2 = " << r2 << endl;     // r2 = 1.3
27     cout << "r3 = " << r3 << endl;     // r3 = 1.3
28     
29     return 0;
30 }

结果如下:

 

有趣的问题:

当函数重载遇见函数模板会发生什么?

 

实例分析:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 
 7 template < typename T >
 8 T Max(T a, T b)
 9 {
10     cout << "T Max(T a, T b)" << endl;
11     
12     return a > b ? a : b;
13 }
14 
15 int Max(int a, int b)
16 {
17     cout << "int Max(int a, int b)" << endl;
18     
19     return a > b ? a : b;
20 }
21 
22 template < typename T >
23 T Max(T a, T b, T c)
24 {
25     cout << "T Max(T a, T b, T c)" << endl;
26     
27     return Max(Max(a, b), c);
28 }
29 
30 int main()
31 {
32     int a = 1;
33     int b = 2;
34     
35     cout << Max(a, b) << endl;                   // 普通函数 Max(int, int)
36     
37     cout << Max<>(a, b) << endl;                 // 函数模板 Max<int>(int, int)
38     
39     cout << Max(3.0, 4.0) << endl;               // 函数模板 Max<double>(double, double)
40     
41     cout << Max(5.0, 6.0, 7.0) << endl;          // 函数模板 Max<double>(double, double, double)
42     
43     cout << Max('a', 100) << endl;               // 普通函数 Max(int, int)
44     
45     return 0;
46 }

结果如下:

 

小结:

 

posted on 2018-09-04 22:47  周伯通789  阅读(177)  评论(0)    收藏  举报