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
浙公网安备 33010602011771号