`

C++模板浅谈

阅读更多


1.  模板的概念。

我们已经学过重载(Overloading) ,对重载函数而言,C++ 的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值 ,我们定义MAX() 函数需要对不同的数据类型分别定义不同重载(Overload) 版本。

// 函数1.

int max(int  x,int  y);
{return(x>y)?x:y ;}

// 函数2.
float max( float  x,float  y){
return (x>y)? x:y ;}

// 函数3.
double max(double  x,double  y)
{return (c>y)? x:y ;}

但如果在主函数中,我们分别定义了 char a,b;  那么在执行max(a,b); 时 程序就会出错,因为我们没有定义char 类型的重载版本。

现在,我们再重新审视上述的max() 函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++ 引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

2.    函数模板的写法

函数模板的一般形式如下:

Template <class 或者也可以用typename  T>

返回类型 函数名(形参表)
{//
函数定义体 }

说明: template 是一个声明模板的关键字,表示声明一个模板关键字class 不能省略,如果类型形参多余一个 ,每个形参前都要加class < 类型 形参表> 可以包含基本数据类型可以包含类类型.

请看以下程序:

//Test.cpp

#include  <iostream>

using  std::cout;

using  std::endl;

// 声明一个函数模版, 用来比较输入的两个相同数据类型的参数的大小,class 也可以被typename 代替,

//T 可以被任何字母或者数字代替。

template  <class  T>

T min(T x,T y)

return (x<y)?x:y;}

void  main( )

{

      int  n1=2,n2=10;

      double  d1=1.5,d2=5.6;

      cout<< " 较小整数:" <<min(n1,n2)<<endl;

      cout<< " 较小实数:" <<min(d1,d2)<<endl;

      system("PAUSE" );

}

程序运行结果: 

 

程序分析:main() 函数中定义了两个整型变量n1 , n2  两个双精度类型变量d1 , d2 然后调用min( n1, n2);  即实例化函数模板T min(T x, T y) 其中T为int 型,求出n1,n2 中的最小值.同理调用min(d1,d2) 时,求出d1,d2 中的最小值.

3.  类模板的写法

定义一个类模板:

Template < class 或者也可以用typename  T >
class
类名{
//类定义......
};

说明:其中,template 是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。

例如:定义一个类模板:

// ClassTemplate.h
#ifndef  ClassTemplate_HH

#define  ClassTemplate_HH

template <typename  T1,typename  T2>

class  myClass{

private :

      T1 I;

      T2 J;

public :

      myClass(T1 a, T2 b);//Constructor

      void  show();

};

// 这是构造函数

// 注意这些格式

template  <typename  T1,typename  T2>

myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

// 这是void show();

template  <typename  T1,typename  T2>

void  myClass<T1,T2>::show()

{

      cout<<"I=" <<I<<", J=" <<J<<endl;

}

#endif

// Test.cpp

#include  <iostream>

#include  "ClassTemplate.h"

using  std::cout;

using  std::endl;

void  main()

{

      myClass<int ,int > class1(3,5);

      class1.show();

      myClass<int ,char > class2(3,'a' );

      class2.show();

      myClass<double ,int > class3(2.9,10);

      class3.show();

      system("PAUSE" );

}

最后结果显示:

 

4.非类型模版参数

一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。

那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。


template <typename  T, int  MAXSIZE>

class  Stack{

Private:

        T elems[MAXSIZE];

};

Int main()

{

        Stack<int , 20> int20Stack;

        Stack<int , 40> int40Stack;

};

 

分享到:
评论

相关推荐

    浅谈C++模板实现模块间参数传递及回调

    一篇关于C++模板 设计模式 软件架构的文档,里面实现了一个泛化的命令模式和观察者模式

    浅谈C++模板元编程

    本篇文章主要介绍了浅谈C++模板元编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅谈C++之模板

    模板是C++泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。 什么是模板 假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于等于第二值。在实际中,我们可能想要定义多个函数...

    浅谈C++内存分配及变长数组的动态分配

    下面小编就为大家带来一篇浅谈C++内存分配及变长数组的动态分配。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅谈C++11新引入的lambda表达式

    ISO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下: [capture list] (parameter list) -&gt;return type { function body } 简单的讲一下各个部分的作用 1.[capture list]捕获列表,捕获到函数体中,使得...

    浅谈c++之关联容器

    map 先看一个经典的单词计数器程序: map word_count;//定义string到size_t的map string word ; while(cin&gt;&gt;word) ++word_count[word];//提取word的计数器并...关联容器跟顺序容器类似的d地方是他们都是模板,在定义m

    深入解析C++ STL中的常用容器

    下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    STL常用容器详细解析

    下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

Global site tag (gtag.js) - Google Analytics