C++中的模板template小结

函数模板

我们可以把函数模板当做一种特殊的函数,里面的参数类型可以是任意类型,这样的话我们就可以减少重复定义,从而让这个函数模板自动适应不同的参数类型,也就是说函数可以适应多种类型的参数,例如doubleint或者类什么的。

C++为了实现上面的功能,引入了template这个概念。我们可以把template当成是一种特殊的类型参数,并且也可以在函数里当做参数传递,心里面把它当做int什么的就行了。

使用类型参数声明函数模板的格式如下所示:

template <class identifier> function_declaration;
template <typename identifier> function_declaration;
 // 这里使用了typename 当做声明类型参数

上面声明函数模板的格式只有一处不同,那就是classtypename,在这里其实使用哪一种都没有区别,看自己喜欢就行,C++对此也没有做严格的区分;

为了更好的说明如何使用函数模板,便在举一个很形象的例子,那就是一个用来返回较大值的函数,具体写法如下所示:

template <typename T>
T GetMax(T a, T b)
 return a > b ? a : b;

在上面的短短几行代码中我们就创建了一个函数模板用来获取两个数之间较大的那个数,不难看出T在这里并没有指明具体的类型,在这我们仍然可以在心里把它当做普通变量处理,返回值也是T。

为了使用我们定义的函数模板,可以参照统一的函数模板调用格式:

function_name<type> (parameters);
// type就是具体的类型,例如int、double这些,parameters就是函数里的参数,也是具体类型

所以,如果我们想要实现获取两个整形值里较大的那个,我们可以传入int这个类型之后调用GetMax函数,具体示例如下:

int x = 4;
int y = 2;

int max = GetMax<int> (x, y); // max = 4

类模板

由于template声明的类型可以是任意类型,也就是使用的时候传入具体的类型就行。所以可以参考上面函数模板的例子构造类模板也是一样的,在使用这个类的时候传入具体的变量类型就行了。例如下面的类模板定义:

template <typename T>
class MyPair{
 T value[2];

 public:
  MyPair(T first, T second)
  {
   value[0] = first;
   value[1] = second;
  }
 };

类模板的示例代码中定义一个MyPair类,用来存储任意类型的两个元素,例如doublecharint等,下面我就给出两个示例,分别存储doubleint类型的变量

MyPair<int> myInt(2, 3); // 存储两个整型值
MyPair<double> myDouble(2.3, 3.43); // 存储两个double值

模板类的成员函数也可以在类外定义,写法和函数模板的写法是一样的,具体示例如下所示:

template <class T>
class MyPair {
 T a, b;
 public:
 mypair (T first, T second)
  {a=first; b=second;}
 T Getmax ();
};

template <typename T>
T MyPair<T>::Getmax () // 在类外定义函数, 注意前面的写法和函数模板写法一致
{
 T retval;
 retval = a>b? a : b;
 return retval;
}

模板特化

如果我们想要为类模板定义一个不同的实现接口,并且要求需要将特定参数作为参数传递时,那么我们就可以将该模板特化

为了更好地说明模板特化,还是举个简单的例子吧。假设我们定义一个类mycontainer,这个类可以存储一个任意类型的变量,并且这个类还有一个函数叫做increasement用来将存储的类型加一。并且,如果这个类存储的是一个char类型的时候,我们会发现这个类对于实现将其中的成员变量转换为大写的功能将更加方便,不妨将这个函数定义为ToUpper,因此,我们可以为char类型的类模板实现模板特化,具体的示例代码如下:

// 模板特化
#include <iostream>
using namespace std;

// 声明类模板:
template <typename T>
class mycontainer {
 T element;
 public:
 mycontainer (T arg) {element=arg;}
 T increase () {return ++element;}
};

// char类型的模板特化:
template <>
class mycontainer<char> {
 char element;
 public:
 mycontainer(char arg) {element=arg;}

 char ToUpper()
 {
  if ((element>='a')&&(element<='z'))
  element+='A'-'a';
  return element;
 }
};

对于上面的模板特化,我们需要几点,注意类模板和模板特化的区别和联系

  • 在类模板的前面加上template <>,这表明是模板特化,也就是是说模板特化都需要加上这句话;
  • 还有一点就是类模板后面使用了<char>参数,这个特定参数表示我们将模板类特化程<char>类型;

template的其他用法

除了以template或者class关键字开头声明的表示类型的模板参数之外,template也可以具有其他类型的参数,例如intdouble这些参数,就类似于一个函数中拥有多个参数,每个参数类型还不一样。为了更好的说明template的其他用法,不妨参考下面的示例代码,

#include <iostream>
using namespace std;

template<class T, int N> // 这里除了含有class声明的类型之外,还拥有一个int类型
class mysequence {
 T memblock [N];
 public:
 void setmember(int x, T value);
 T getmember(int x);
};

template<class T, int N>
void mysequence<T,N>::setmember(int x, T value) {
 memblock[x]=value;
}

template<class T, int N>
T mysequence<T,N>::getmember(int x) {
 return memblock[x];
}

int main(){
 mysequence<int,5> myints;
 mysequence<double,5> myfloats;
 myints.setmember(0,100);
 myfloats.setmember(3,3.1416);
 cout << myints.getmember(0) << '\n';
 cout << myfloats.getmember(3) << '\n';
 return 0;
}

总结

到此这篇关于C++总结之template的文章就介绍到这了,更多相关C++总结之template内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++设计模式之模板方法模式(TemplateMethod)

    模板方法模式使用继承来实现模式的功能,在基类使用一个方法来定义算法的各个步骤,这些步骤(方法)的具体实现会放到子类中,通过这样来实现不同算法对象的算法拼合,完成该对象整体算法的实现. 作用 模板方法中定义了具体操作中所使用算法的各个步骤,并将其实现交由子类完成,从而实现多种不同的功能: 类视图 实现 class Lunch { public: Lunch(){} virtual ~Lunch(){} void feed() { cooking(); eating(); cleaning(); }

  • C++设计模式编程中Template Method模板方法模式的运用

    准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模版方法模式的用意. 很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式.模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心. 模版方法模式需要开发抽象类和具体子类的设计师之间的协作

  • C++ Template 基础篇(一):函数模板详解

    Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第一部分. 为什么要有泛型编程 C++是一门强类型语言,所以无法做到像动态语言(python javascript)那样子,编写一段通用的逻辑,可以把任意类型的变量传进去处理.泛型编程弥补了这个缺点,通过把通用逻辑设计为模板,摆脱了类型的限制,提供了继承机制以外的另一种抽象机制,极大地提升了代码的可重用性. 注意:模板定义本身不参与编译,而是编译器根据模板的用户使

  • C++的template模板中class与typename关键字的区别分析

    在C++模板中,可以使用class或者typename来声明模板参数,那么这两个关键字有什么区别呢? 模板参数声明 对于模板参数声明,这两个参数没有区别,含义是一样的. template class Simple; template class Simple; 上面两行都是声明一个模板类Simple. 表明类型 假如我们有这样一段代码: template void add(const T &acontainer, T &sum) { T::const_iterator iter = con

  • C++ Template应用详解

    引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计.C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream. 函数模板 在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下: void swap(int&a , int& b) { int temp = a; a = b; b = temp; } 但是如果是要支持long,string,自定义class的swap函

  • c++中template对字符串的处理方法

    C++中的Template作用是把仅类型不同但功能相似的函数合并在一起,但是有时候template中的函数并不能满足所有的类型调用.如下所示: template <class Kty> inline int hash_wrap(const Kty& k) { return (int)k; } 所有的数字类型使用该模板都没有问题,但是string类型却不行,因为不支持有string到int的类型转换(编译过程中).这样我们就需要在该模板外添加一个对string类型的支持,代码如下: te

  • C++中的模板template小结

    函数模板 我们可以把函数模板当做一种特殊的函数,里面的参数类型可以是任意类型,这样的话我们就可以减少重复定义,从而让这个函数模板自动适应不同的参数类型,也就是说函数可以适应多种类型的参数,例如double.int或者类什么的. C++为了实现上面的功能,引入了template这个概念.我们可以把template当成是一种特殊的类型参数,并且也可以在函数里当做参数传递,心里面把它当做int什么的就行了. 使用类型参数声明函数模板的格式如下所示: template <class identifier

  • C++模板template用法小结(推荐)

    引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计.C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream. 函数模板 在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下: void swap(int&a , int& b) { int temp = a; a = b; b = temp; } 但是如果是要支持long,string,自定义class的swap函

  • C++中模板(Template)详解及其作用介绍

    目录 概述 函数模板 类模板 模板类外定义成员函数 类库模板 抽象和实例 概述 模板可以帮助我们提高代码的可用性, 可以帮助我们减少开发的代码量和工作量. 函数模板 函数模板 (Function Template) 是一个对函数功能框架的描述. 在具体执行时, 我们可以根据传递的实际参数决定其功能. 例如: int max(int a, int b, int c){ a = a > b ? a:b; a = a > c ? a:c; return a; } long max(long a, l

  • Python 中开发pattern的string模板(template) 实例详解

    定制pattern的string模板(template) 详解 string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式. 如: 使用新的定界符"{{", 把{{var}}作为变量语法. 代码: # -*- coding: utf-8 -*- ''''' Created on 2014.6.5 @author: Administrator @edition : python 3.3.0, eclipse pydev '''

  • 分享12个Webpack中常用的Loader(小结)

    目录 前言 style-loader css-loader sass-loader postcss-loader babel-loader ts-loader html-loader file-loader url-loader html-withimg-loader vue-loader eslint-loader 总结 前言 初衷: 整理一些常用的loader分享给大家,方便知道在什么场景下该用什么loader.如果有大佬都懂悄悄左滑就行,不喜勿喷. 适合人群: 前端初级开发. style-

  • nodejs中art-template模板语法的引入及冲突解决方案

    使用Webstorm创建nodejs express应用时,默认使用的是jade或者ejs模板,对于不习惯这两种模板语法的人来说确实不是很方便.没关系,这里我们使用art-template模板引擎,使用后可以直接使用html模板: 1.安装art-template npm install art-template 2.修改app.js文件,添加如下代码: // view engine setup app.set('views', path.join(__dirname, 'views')); v

  • 简单理解vue中el、template、replace元素

    本文实例为大家解析了vue中el.template.replace的元素,供大家参考,具体内容如下 api: http://cn.vuejs.org/api/#el el 类型: String | HTMLElement | Function 限制: 在组件定义中只能是函数. 详细: 为实例提供挂载元素.值可以是 CSS 选择符,或实际 HTML 元素,或返回 HTML 元素的函数.注意元素只用作挂载点.如果提供了模板则元素被替换,除非 replace 为 false.元素可以用 vm.$el

  • Python编程之字符串模板(Template)用法实例分析

    本文实例讲述了Python编程之字符串模板(Template)用法.分享给大家供大家参考,具体如下: #coding=utf8 ''''' 字符串格式化操作符,需要程序员明确转换类型参数, 比如到底是转成字符串.整数还是其他什么类型. 新式的字符串模板的优势是不用去记住所有相关细节, 而是像shell风格的脚本语言里面那样使用美元符号($). 由于新式的字符串引进Template对象, Template对象有两个方法:substitute().safe_substitute(). substit

  • 详解在Python的Django框架中创建模板库的方法

    不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 manage.py startapp 创建了一个应用,你可以把它放在那里,或者你可以为模板库单独创建一个应用. 我们更推荐使用后者,因为你的filter可能在后来的工程中有用. 无论你采用何种方式,请确保把你的应用添加到 INSTALLED_APPS 中. 我们稍后会解释这一点. 第二,在适当的Django应用包里创

  • 详解微信小程序中的页面代码中的模板的封装

    详解微信小程序中的页面代码中的模板的封装 最近在进行微信小程序中的页面开发,其实在c++或者说是js中都会出现这种情况,就是相同的代码会反复出现,这就是进行一定的封装,封装的好处就是可以是程序中在于减少一定的代码量,并且可是使代码结构更加清晰.那今天所要记录的就是关于微信小程序中的页面的模板封装. 在微信小程序中的文件名都带有wxml等样式,在wxml中提供了模板,即可以在模板中定义代码片段,然后可以在页面中的不同位置进行调用,模板的定义: <templatename="products&

随机推荐