C++之模板(Template)

原创 2005年04月29日 11:27:00
模板是C++提供进行编程的一种类书工具。所以在看本文以前请先了解一下C++类书的概念及相关的知识。
1.模板的概念
模办是实现类属机制的一种工具,它的功能非常强,它是无约束类属机制和约束类属机制的集合。 它可以让用户构造模板函数。 
模板,对象, 函数之间的关系见下图:

  

2.函数模板与模板函数:

先见下例:

#include <iostream.h>

template<class T>            //模板声明

T max(T x,T y)               //定义模板
{ 
    return
(x>y)? x:y;
}

main()
{
      int i=10,j=56;
      float x1=50.34, x2=56.34;
      double y1=673.36, y2=465.972;
      cout<<"the max of i, j is:"<<max(i, j)<<"/n";
      cout<<"the max of x1, x2 is:" <<max(x1,x2)<<"/n";
      cout<<"the max of y1, y2 is:" <<max(y1,y2)<<"/n";
      return 1;
}

    上面的这个程序虽然只是实现一个很简单的比较大小的问题, 但如果不用模板, 而用我们以前的方法, 由于参数类型和返回值类型不同将需要三个函数来实现, 这样是十分麻烦的。模板成功的解决了这个问题, 程序中生成了三个模板函数, 其中max(i,j)用模板实参int将类型实参数T进行了实例化;max(x1,x1)用模板实参float将类型参数T进行了实例化;max(y1,y2)用模板实参double将类型参数T进行了实例化。

    从上面的例子我们可以看出, 函数模板提供了一类函数的抽象, 它以任意类型T为参数及函数返回值。由一个函数模板产生的函数称为模板函数, 它是函数模板的具体实例。

函数模板和模板函数的关系图:

   要提醒大家注意的一点是:虽然模板参数T可以实例化成各种类型, 但是采用模板参数T的各种参数T的各参数之间必须保持完全一致的类型。例如:

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

void func(int i, char c, float)
{
   max(i,i);   //正确
   max(c,c);   //正确
   max(c,i);   //错误
   max(f,i);   //错误
}

    解决上面的问题就需要引入一个型的概念—重载, 既可以用非模板函数重载一个同名的函数模板。 重载有两种表述方式:

    1.利用函数模板的函数体

        使用次方法是必须注意各模板参数的实参类型必须一致。例如:

        int max(int,int)

    2.重新定义函数体

        对于要重新定义函数体的重载函数, 所带参数的类型可以随意, 就象一般的重载函数一样定义。

    定义重载函数特别要注意避免产生预期的和非预期的二义性。例如:

int max(int, int);

char max(int x,char y)
{
       //......
}


   当进行函数调用时有这样一个调用形式:
msx(i,j);
   此处iint,ffloat,这个函数调用就存在着二义性。这时的调用就需要按照一定的规则安排先后顺序, 这些规则就是函数模板与同名的非模板函数的重载方法均遵循的约定:

    (1)寻找一个参数完全匹配的函数, 如果找到了就调用它。

    (2)(1)失败后, 寻找一个函数模板, 使其实例化, 产生一个匹配的模板函数, 若找到了,就调用它。

    (3)(1)(2)均失败后, 再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等, 若找到了,就调用它。

    (4)(1)(2)(3)均失败, 则这是一个错误的调用。

3.类模板与模板类

    类模板与模板类的概念

    一个类模板可以让用户为类定义一种模式, 使得类中的某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型。

    定义一个类模板, 一般由两方面的内容:

    (1)首先要定义类, 其格式为:

template<class T>  //声明一个模板

class name
{
    //....
}

    name为类名,在类定义体中如采用数据类型的成员, 函数参数的前面需加上T。例如:

template<class T>

class vector
{
     T * data;
     int size;
     pulic:
     vetor(int);
     T&operator[](int);
     //...
};

    (2)在类定义体外定义成员函数时, 若此成员函数中有模板参数存在, 则需在函数体外进行模板声明, 并且在函数名前的类名后缀上“<T>”.例如:

template<class T>

vector<T>::vector(int i)
{
     //....
}

template<class T>

T&vector<T>::operator[](int i)
{
     //....
}

    类模板的使用

    类模板的使用实际上是将类模板实例化成一个具体的类, 它的格式为:

    类名<实际的类型>
    例如:

main()
{
     vector<int>x(5);
     for(int i=0; i<=5;i++)
     x[i]=i;
     for(i=0;i<5;++i)
     cout<<x[i]<<"";
     cout<<"/n";
}

    类模板和模板类之间的关系, 如图:

   

    类模板使用需要注意的几点:

    (1)在每个模板定义之前, 不管是类模板还是函数模板, 都需要在前面加上模板声明:

template<class T>

    (2)类模板和结构模板在使用时, 必须在名字后面缀上模板参数<T>,如:list<T>,node<T>.

C++模板template用法总结

引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。 ...
  • qq_35637562
  • qq_35637562
  • 2017年02月15日 12:37
  • 5830

[C/C++]_[简单例子看模板template的特性]

场景: 1. 模板在C++里是
  • infoworld
  • infoworld
  • 2014年06月11日 01:01
  • 2602

c++11 template using,模板别名

c++11特性 template using,模板别名 作用: 当已经存在一个模板,其参数列表比较长,但是有一些模板参数默认基本是可以确定的, 因此可以使用这个模板别名来少些这些参数 例子: te...
  • qq_16097611
  • qq_16097611
  • 2016年12月05日 14:51
  • 743

c++ 模板的使用

如何使用C++模板
  • lccrun
  • lccrun
  • 2017年03月08日 23:48
  • 255

关于C++ template 的初始化

新手可能会遇到编译没问题,自己写的模版类, 把声明(头文件.h)跟实现(cpp)分开, 编译时包括了模版的头文件, 编译没问题, 但连接不通过...是因为,如果你编译的代码模块中没用到那模版类的话, ...
  • touzani
  • touzani
  • 2007年05月15日 23:25
  • 1507

C++模板编程->指针及引用模板参数

//以指针为模板参数 template struct wrapper { /* data */ int get(){return *p;} voi...
  • sunboyiris
  • sunboyiris
  • 2014年04月05日 11:19
  • 1532

c++模板元编程四:IF语句编译时运行

2.3 if 替代将if语句放在编译期执行,可以用模板特化的方式实现。下面是调用代码:// test if cout ...
  • sheismylife
  • sheismylife
  • 2015年04月05日 16:41
  • 2174

c++模板中的 typename 和 template 关键字用法

    最近在看C++的模板,虽然学了、用了C++也有一段时间,对于模板编程这一特性一直没有接触。边学习, 一边写些心得吧。1. typename关键字   不用说,接触过模板的人都知道,typena...
  • hycoldrain
  • hycoldrain
  • 2009年01月05日 20:43
  • 8916

C++模板(template)使用介绍

1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需...
  • chenchen410
  • chenchen410
  • 2014年09月23日 18:44
  • 34695

C++实践参考:两个成员的类模板

【项目-两个成员的类模板】   设有如下的类声明:class Test{ public: void SetData1(int val) { data1=val; } void SetDat...
  • sxhelijian
  • sxhelijian
  • 2016年05月26日 15:17
  • 2294
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: C++之模板(Template)
举报原因:
原因补充:

(最多只允许输入30个字)