C++之模板(template)

原创 2016年06月01日 11:34:26
  模板(template)是C++最为强大的 功能之一,它使得算法的实现无关于数据的类型,使模板能适用于任意一组相关的函数和类。模板的意义是实现数据类型的参数化,提高了代码的重用率。

eg:计算两个数的最大值。

#include<iostream>
using namespace std;
int myMax(int a,int b){
   return a>b?a:b;
}
char myMax(char a,char b){
   return a>b?a:b;
}
double myMax(double a,double b){
   return a>b?a:b;
}
int main(){
    cout<<myMax(5,6)<<endl;
    cout<<myMax('X','h')<<endl;
    cout<<myMax(5.5,6.7)<<endl;
    return 0;
}

输出结果:
这里写图片描述

 你会发现上面像老太太的缠脚布,真是又臭又长。下面我用模板去简化下上面的代码。

#include<iostream>
using namespace std;
template<typename T>
T myMax(T a,T b){
   return a>b?a:b;
}
int main(){
    cout<<myMax(5,6)<<endl;
    cout<<myMax('X','h')<<endl;
    cout<<myMax(5.5,6.7)<<endl;
    return 0;
}

输出结果:
这里写图片描述

  综上你会发现使用模板两个优点:
   1.减少重复代码 
   2.处理目前未知数据 

  实现模板的重要手段就是“数据类型参数化”。分为两个层次:数据的参数化;类型的参数化。所谓参数化就是将具体的数据或数据类型的形式化表示。
  其中template是模板的标识,尖括号部分<class T>是对数据类型形式参数T的说明,关键字class表明它是一个模板形式参数。

  模板分为类模板和函数模板,对于函数模板的定义的语法规则如下:
  (1)所有模板都必须以关键字template开始,关键字template告诉编译器下面的程序代码将会操作多种数据类型。
  (2)以尖括号<>括起来的部分为模板形参列表,在该类表中声明了一个或多个模板形参,若多个模板形参,它们之间用逗号隔开,并且所有的形参前面必须加关键字class或者typename。
  eg:
         template<typename T,typename Q>
         void do_anything(T t,Q q);
  (3)除了模板语法外,普通函数和模板函数的唯一区别就是有表示类型参数的T表示函数形参的类型。

  对于类和结构体也可以带模板。
  eg:
        template<typename T>
        class Poin{
             T x,y;
             point(T x=0,T y=0):x(x),y(y){}//表示把成员变量x,y初始化为参数x,y 
        };      

  结构体和类差异很小,主要区别在默认访问对象和继承方式不同。在工程中一般用struct定义纯数字,包含较少的成员函数;class定义复杂的行为。

  本文只是为了解模板函数和模板类,为能更好的理解(标准模板库)STL做铺垫。
版权声明:本文为博主原创文章,未经博主允许不得转载。

C++模板template用法总结

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

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

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

c++ 模板的使用

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

c++11 template using,模板别名

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

关于C++ template 的初始化

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

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

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

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

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

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

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

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

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

【C++模板】C++声明模板时能否用struct关键字代替class或者typename

我们知道C++中声明一个函数或者类的模板支持两种关键字class和typename: template struct Person { public: T age; }; 或者 tem...
  • lzhui1987
  • lzhui1987
  • 2017年03月20日 19:04
  • 1186
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++之模板(template)
举报原因:
原因补充:

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