一个程序如果定义的类型是int类型,那么怎么样处理double类型的数据呢?我们传统的是将所有的 int 类型全部改成 double 类型 ,小程序这样改无疑是不错的选择,就算要改成char, string 等其他类型也不会消耗太多的资源。但是,如果是一个大型的程序呢?这样依靠手动修改类型是不是不合适?C++的 template 给我们提供了解决方案。
template也叫模板,是泛型编程。泛型编程含义如下:
泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象这样的事;泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含义,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。
-----摘自百度百科
了解即可。
分为函数模板、类模板
函数模板格式如下:
template <typename type>
ret-type func-name(parameter list)
{
// 函数的主体
}
类模板格式如下:
template <class type>
class class-name {
.
.
.
}
它的使用格式:template <class 自定义类型名称>
比如要把类型当做变量,可:template ,要在每一个接口(或者叫方法、函数)前面一行 写上 template ,接口中,类名后面要写上,如:
template <class DataType>
CDArray<DataType>::CDArray(int nSize, DataType dValue)
{
m_pData = new DataType[nSize];
for(int i=0; i<nSize; i++)
{
m_pData[i] = dValue;
}
m_nSize = nSize;
m_nMax=nSize;
}
不太明白的有地方,就是输出函数中要根据定义来进行判断类型,进行选择如下:
template <class DataType>
int CDArray<DataType>::Display()
{
//输出函数
if(m_nSize==0)
return FALSE;
if( m_pData == NULL )
return FALSE;
for( int i=0; i<GetSize(); i++)
{
char const *typen = typeid( DataType ).name();
if( !strcmp( typen, "double" ) )
printf(" type: %lf ", m_pData[i] );
else if( !strcmp( typen, "int" ) )
printf(" type: %d ", m_pData[i] );
printf("\n");
}
return TRUE;
}
这个程序的测试如下:
#include <stdio.h>
#include "Array0.h"
void main()
{
// test double array
CDArray<double> pa;
//pa.InitArray( );
pa.SetSize( 3 );
pa.SetAt( 0, 1.0 );
pa.SetAt( 1, 2.0 );
pa.SetAt( 2, 3.0 );
pa.Display( );
//pa.FreeArray( );
// test int array
CDArray<int> pb;
//pb.InitArray( );
pb.SetSize( 3 );
pb.SetAt( 0, 10 );
pb.SetAt( 1, 11 );
pb.SetAt( 2, 12 );
pb.Display( );
//pb.FreeArray( );
}
运行结果如下:
个人学习所得,如有错误或者高见,欢迎指正!