PoEdu - STL模板编程【Po学校】- Lesson002模板函数
模板函数
什么 是函数模板,什么又是模板函数?
A: 函数模板是模板函数没有实例化之前的样板,实例化之后就成了模板函数.函数模板不调用就不被编译.
函数模板中不可以加virtual,无论在有没有参数的情况下.因为类型不确定.
同一个类中,函数模板与类成员可以互相调用.
函数模板可以自动推导也类型,也可以强制指定类型.
注意:在调用模板函数时,一定是实例化后的,编译器分两步来解析模板:1,先检查语法错误;2,实例化模板.所以在调用模板函数时,要注意生成的模板函数与函数模板之间的区别.
#include <iostream> #include <cstdlib> using namespace std; template<typename T> void Swap(T& a, T& b) { T t = a; a = b; b = t; } int main() { int a = 1; int b = 2; Swap(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; }
运行:
a = 2
b = 1
#include <iostream> #include <cstdlib> using namespace std; template<typename T> void Swap(T& a, T& b) { T t = a; a = b; b = t; } int main() { int a = 1; int b = 2; Swap(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; float fa = 3.0 ; float fb = 4.0; Swap<float>(fa, fb); cout << "fa = " << fa << endl; cout << "fb = " << fb << endl; return 0; }
运行:
a = 2
b = 1
fa = 4
fb = 3
#include <iostream> #include <cstdlib> using namespace std; template<typename T> void Swap(T& a, T& b) { T t = a; a = b; b = t; } int main() { int a = 1; int b = 2; Swap(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; float fa = 3.0 ; float fb = 4.0; Swap<float>(fa, fb); cout << "fa = " << fa << endl; cout << "fb = " << fb << endl; char ca = 'a'; char cb = 'b'; Swap(ca, cb); cout << "ca = " << ca << endl; cout << "cb = " << cb << endl; return 0; }
运行:
a = 2
b = 1
fa = 4
fb = 3
ca = b
cb = a
#include <iostream> #include <cstdlib> using namespace std; template<typename T> void Swap(T& a, T& b) { T t = a; a = b ; b = t; } template<typename T> void SelectSort(T array[], int length) { for(int i = 0; i<length; i++) { T min = array[i]; int index = i; for(int j = i+1; j<length; j++) { if(array[j] < min) { min = array[j]; index = j; } } Swap(array[i], array[index]); } } int main() { int array[] = {3,2,6,1,4}; SelectSort<int>(array,5); for(int i = 0; i<5; i++) { cout << array[i] << endl; } return 0; }
运行:
1
2
3
4
6
#include <iostream> #include <cstdlib> using namespace std; template<typename T> void Swap(T& a, T& b) { T t = a; a = b ; b = t; } template<typename T> void SelectSort(T array[], int length) { for(int i = 0; i<length; i++) { T min = array[i]; int index = i; for(int j = i+1; j<length; j++) { if(array[j] < min) { min = array[j]; index = j; } } Swap(array[i], array[index]); } } int main() { int array[] = {3,2,6,1,4}; SelectSort<int>(array,5); for(int i = 0; i<5; i++) { cout << array[i] << endl; } char ca[] = {'c','f','e','b','d','a'}; SelectSort(ca,6); for(int i = 0; i<6; i++) { cout << ca[i] << endl; } return 0; }
运行:
1
2
3
4
6
a
b
c
d
e
f
#include <iostream> #include <cstdlib> using namespace std; int Max(int a, int b) { cout <<"int Max(int a, int b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b) { cout <<"T Max(T a, T b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b, T c) { cout <<"T Max(T a, T b, T c)" << endl; return Max(Max(a, b), c); } int main() { int a = 1; int b = 2; cout << Max(a, b)<< endl; cout << Max<>(a, b)<< endl; return 0; }
运行:
int Max(int a, int b)
2
T Max(T a, T b)
2
#include <iostream> #include <cstdlib> using namespace std; int Max(int a, int b) { cout <<"int Max(int a, int b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b) { cout <<"T Max(T a, T b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b, T c) { cout <<"T Max(T a, T b, T c)" << endl; return Max(Max(a, b), c); } int main() { int a = 1; int b = 2; cout << Max(a, b)<< endl; cout << Max<>(a, b)<< endl; cout << Max(3.0, 4.0) <<endl; return 0; }
运行:
int Max(int a, int b)
2
T Max(T a, T b)
2
T Max(T a, T b)
4
#include <iostream> #include <cstdlib> using namespace std; int Max(int a, int b) { cout <<"int Max(int a, int b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b) { cout <<"T Max(T a, T b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b, T c) { cout <<"T Max(T a, T b, T c)" << endl; return Max(Max(a, b), c); } int main() { int a = 1; int b = 2; cout << Max(a, b)<< endl; cout << Max<>(a, b)<< endl; cout << Max(3.0, 4.0) <<endl; cout << Max(5.1, 6.2, 7.3)<< endl; return 0; }
运行:
int Max(int a, int b)
2
T Max(T a, T b)
2
T Max(T a, T b)
4
T Max(T a, T b, T c)
T Max(T a, T b)
T Max(T a, T b)
7.3
#include <iostream> #include <cstdlib> using namespace std; int Max(int a, int b) { cout <<"int Max(int a, int b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b) { cout <<"T Max(T a, T b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b, T c) { cout <<"T Max(T a, T b, T c)" << endl; return Max(Max(a, b), c); } int main() { int a = 1; int b = 2; cout << Max(a, b)<< endl; cout << Max<>(a, b)<< endl; cout << Max(3.0, 4.0) <<endl; cout << Max(5.1, 6.2, 7.3)<< endl; cout << Max('a', 100)<< endl; return 0; }
运行:
int Max(int a, int b)
2
T Max(T a, T b)
2
T Max(T a, T b)
4
T Max(T a, T b, T c)
T Max(T a, T b)
T Max(T a, T b)
7.3
int Max(int a, int b)
100
如果注释掉普通函数
#include <iostream> #include <cstdlib> using namespace std; /* int Max(int a, int b) { cout <<"int Max(int a, int b)" << endl; return a > b ? a : b; } */ template<typename T> T Max(T a, T b) { cout <<"T Max(T a, T b)" << endl; return a > b ? a : b; } template<typename T> T Max(T a, T b, T c) { cout <<"T Max(T a, T b, T c)" << endl; return Max(Max(a, b), c); } int main() { int a = 1; int b = 2; cout << Max(a, b)<< endl; cout << Max<>(a, b)<< endl; cout << Max(3.0, 4.0) <<endl; cout << Max(5.1, 6.2, 7.3)<< endl; cout << Max('a', 100)<< endl; return 0; }
运行:
Compilation Failed /usercode/file.cpp: In function 'int main()': /usercode/file.cpp:38:22: error: no matching function for call to 'Max(char, int)' cout << Max('a', 100)<< endl; ^ /usercode/file.cpp:38:22: note: candidates are: /usercode/file.cpp:13:4: note: template<class T> T Max(T, T) T Max(T a, T b) ^ /usercode/file.cpp:13:4: note: template argument deduction/substitution failed: /usercode/file.cpp:38:22: note: deduced conflicting types for parameter 'T' ('char' and 'int') cout << Max('a', 100)<< endl; ^ /usercode/file.cpp:20:4: note: template<class T> T Max(T, T, T) T Max(T a, T b, T c) ^ /usercode/file.cpp:20:4: note: template argument deduction/substitution failed: /usercode/file.cpp:38:22: note: deduced conflicting types for parameter 'T' ('char' and 'int') cout << Max('a', 100)<< endl; ^
#include <iostream> #include <cstdlib> using namespace std; template<typename T1, typename T2, typename RT> RT Add(T1 a, T2 b) { return static_cast<RT>(a + b); } int main() { cout << Add<char, float, double>('a', 100.0f)<< endl; return 0; }
运行:
197
#include <iostream> #include <cstdlib> using namespace std; template<typename T1, typename T2, typename RT> RT Add(T1 a, T2 b) { return static_cast<RT>(a + b); } int main() { cout << Add<char, float, double>('a', 100.0f)<< endl; cout << Add('a', 100.0f)<< endl; return 0; }
运行:
Compilation Failed /usercode/file.cpp: In function 'int main()': /usercode/file.cpp:16:25: error: no matching function for call to 'Add(char, float)' cout << Add('a', 100.0f)<< endl; ^ /usercode/file.cpp:16:25: note: candidate is: /usercode/file.cpp:7:5: note: template<class T1, class T2, class RT> RT Add(T1, T2) RT Add(T1 a, T2 b) ^ /usercode/file.cpp:7:5: note: template argument deduction/substitution failed: /usercode/file.cpp:16:25: note: couldn't deduce template parameter 'RT' cout << Add('a', 100.0f)<< endl; ^
一个不完美的解决方案:
#include <iostream> #include <cstdlib> using namespace std; template<typename RT, typename T1, typename T2> RT Add(T1 a, T2 b) { return static_cast<RT>(a + b); } int main() { cout << Add<double, char, float>('a', 100.0f)<< endl; //cout << Add('a', 100.0f)<< endl; cout << Add<double>('a', 100.0f)<< endl; return 0; }
运行:
197
197