深入理解函数模板:

注意事项:

示例:

两个指针打印了不同的值,这说明编译器根据函数模板产生了两个具体的函数。
添加一个新类型:
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 }
结果如下:

小结:

浙公网安备 33010602011771号