模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是指创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。 每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector 。 我们可以使用模板来定义函数和类。
【 1. 函数模板 】
函数模板的一般形式如下: type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。
template < class type > Returntype functionName ( parameter list)
{
}
# include <iostream>
# include <string>
using namespace std;
template < typename T >
inline T const & Max ( T const & a, T const & b)
{
return a < b ? b: a;
}
int main ( )
{
int i = 39 ;
int j = 20 ;
cout << "Max(i, j): " << Max ( i, j) << endl;
double f1 = 13.5 ;
double f2 = 20.7 ;
cout << "Max(f1, f2): " << Max ( f1, f2) << endl;
string s1 = "Hello" ;
string s2 = "World" ;
cout << "Max(s1, s2): " << Max ( s1, s2) << endl;
return 0 ;
}
【 2. 类模板 】
泛型类声明的一般形式如下所示: type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。
template < class type > class class - name {
.
.
.
}
实例:定义类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作。
# include <iostream>
# include <vector>
# include <cstdlib>
# include <string>
# include <stdexcept>
using namespace std;
template < class T >
class Stack {
private :
vector< T> elems;
public :
void push ( T const & ) ;
void pop ( ) ;
T top ( ) const ;
bool empty ( ) const {
return elems. empty ( ) ;
}
} ;
template < class T >
void Stack < T> :: push ( T const & elem)
{
elems. push_back ( elem) ;
}
template < class T >
void Stack < T> :: pop ( )
{
if ( elems. empty ( ) ) {
throw out_of_range ( "Stack<>::pop(): empty stack" ) ;
}
elems. pop_back ( ) ;
}
template < class T >
T Stack < T> :: top ( ) const
{
if ( elems. empty ( ) ) {
throw out_of_range ( "Stack<>::top(): empty stack" ) ;
}
return elems. back ( ) ;
}
int main ( )
{
try {
Stack< int > intStack;
Stack< string> stringStack;
intStack. push ( 7 ) ;
cout << intStack. top ( ) << endl;
stringStack. push ( "hello" ) ;
cout << stringStack. top ( ) << std:: endl;
stringStack. pop ( ) ;
stringStack. pop ( ) ;
}
catch ( exception const & ex) {
cerr << "Exception: " << ex. what ( ) << endl;
return - 1 ;
}
}