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

 

posted on 2017-03-08 00:58  zzdoit  阅读(182)  评论(0编辑  收藏  举报

导航