一文说清楚c++模板Template的用法

这篇具有很好参考价值的文章主要介绍了一文说清楚c++模板Template的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

模板(Template)指c++程序设计语言中采用类型作为参数的程序设计。

二、函数模板

1.通用格式

函数模板定义格式

template <class identifier> 返回类型 函数名(参数列表)
{
    函数体
}

其中,template和class是关键字,class可以用template替换;<>括号中的参数叫做模板形参,模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译确定了实参类型就称实例化了函数模板的一个实例。以函数swap为例:

template<class T>void swap(T & a, T&b)

当调用这样的模板函数时,类型T就会被调用时的类型代替,比如swap(a, b),其中a,b为int类型,这时模板函数swap中的形参T就会被int所代替,即swap(int &a, int &b); 而当调用,swap(c, d)其中c,d为float类型,这时模板函数swap中的形参T就会被float所代替,即swap(float &a, float &b)。如此就实现了类型通用函数,即和函数形参类型无关。

2.举例

以函数swap举例

void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

从上述函数看出,函数形参类型为int类型。若需支持float、string等其它类型,就需要定义几乎相同的函数只是形参类型不一致而已。如果有一种机制可以复用函数,则可很方便解决此类问题,于是函数模板就出现了。

三、类模板

1.通用格式

类模板定义格式

template <class identifier> class 类名
{
    ...
}
template <class identifier, identifier def_val> class 类名
{
    ...
}

和函数模板一样,内模板也是以template开始后接模板形参。

2.举例

以一个simple的stack 类为例,要求stack可以支持int类型,float类型,string类型等等。若不使用类模板则需要根据不同类型定义不同的类。于是类模板就出现了。

//statck.h
template <class T> class Stack {
    public:
        Stack();
        ~Stack();
        void push(T t);
        T pop();
        bool isEmpty();
    private:
        T *m_pT;        
        int m_maxSize;
        int m_size;
};

//stack.cpp
#include "stack.h"
template <class  T>  Stack<T>::Stack(){
   m_maxSize = 100;      
   m_size = 0;
   m_pT = new T[m_maxSize];
}
template <class T>  Stack<T>::~Stack() {
   delete [] m_pT ;
}
        
template <class T> void Stack<T>::push(T t) {
    m_size++;
    m_pT[m_size - 1] = t;
    
}
template <class T> T Stack<T>::pop() {
    T t = m_pT[m_size - 1];
    m_size--;
    return t;
}
template <class T> bool Stack<T>::isEmpty() {
    return m_size == 0;
}

上述定义了一个simple的stack 类模板,接下来看如何使用。

include "stdio.h"
include "stack.h"

int main()
{
	Stack<int> intStack;
	intStack.push(1);
	intStack.push(2);
	intStack.push(3);

	while(!intStack.isEmpty()) {
		printf("num:%d\n", intStack.pop());
	}

	return 0;
}

上述定义的内模板最多只支持m_maxSize = 100个元数,于是我们可以通过内模板参数配置,实现最大支持元素可配置。

//statck.h
template <class T, int maxsize = 100> class Stack {
    public:
        Stack();
        ~Stack();
        void push(T t);
        T pop();
        bool isEmpty();
    private:
        T *m_pT;        
        int m_maxSize;
        int m_size;
};

//stack.cpp
#include "stack.h"
template <class T, int maxsize>  Stack<T>::Stack(){
   m_maxSize = 100;      
   m_size = 0;
   m_pT = new T[m_maxSize];
}
template <class T, int maxsize>  Stack<T>::~Stack() {
   delete [] m_pT ;
}
        
template <class T, int maxsize> void Stack<T>::push(T t) {
    m_size++;
    m_pT[m_size - 1] = t;
    
}
template <class T, int maxsize> T Stack<T>::pop() {
    T t = m_pT[m_size - 1];
    m_size--;
    return t;
}
template <class T, int maxsize> bool Stack<T>::isEmpty() {
    return m_size == 0;
}

使用如下:

#include "stdio.h"
#include "stack.h"
int main() 
{
	int maxsize = 1024;
	Stack<int, 1024>intStack;
	for(i = 0; i<maxsize; i++) {
		intStack.push(i);
	}
	while(!intStack.isEmpty()) {
		printf("num:%d\n", intStack.pop());
	}
	return 0;
}

四、参考

1.https://blog.csdn.net/fuhanghang/article/details/112563711
2.https://www.cnblogs.com/yangxiaoping/p/8268209.html文章来源地址https://www.toymoban.com/news/detail-628597.html

到了这里,关于一文说清楚c++模板Template的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES之API系列--index template(索引模板)的用法(有实例)

    原文网址:ES之API系列--index template(索引模板)的用法(有实例)_IT利刃出鞘的博客-CSDN博客 说明 本文介绍ElasticSearch的index template(索引模板)的用法(有实例)。 官网网址 https://www.elastic.co/guide/en/elasticsearch/reference/8.0/index-templates.html 作用概述         在 新建 索引时,如果索引名

    2024年04月09日
    浏览(41)
  • C++模板,STL(Standard Template Library)

    这篇文章的主要内容是C++中的 函数模板 、 类模板 、 STL的介绍 。 希望对C++爱好者有所帮助, 内容充实且干货 ,点赞+收藏防止找不到! 再次感谢每个读者和正在学习编程的朋友莅临! 更多优质内容请点击移驾: C++收录库:重生之C++启程(文章平均质量分93) 目录   1.模板

    2024年02月13日
    浏览(46)
  • C++进阶语法——STL 标准模板库(下)(Standard Template Library)【学习笔记(七)】

    1、迭代器 迭代器可以将任意的容器抽象成一个序列,可以使用迭代器遍历容器中的元素 迭代器设计的目的是为了解决容器与算法之间的耦合问题,与指针类似,可以通过迭代器访问容器中的元素 迭代器的声明方式为: 容器类型::iterator 变量名称 , 可以理解为一个普通的指

    2024年02月06日
    浏览(47)
  • 浅谈WPF之控件模板Control Template和数据模板Data Template

    WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计,同时还推出了以模板为核心的新一代设计理念。在WPF中,通过引入模板,将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类:数据模板【Data Template】和控件模板【Control Template】 基本上,ControlT

    2024年02月03日
    浏览(35)
  • ElasticSearch第十六讲 ES 索引模板Index Template与Dynamic Template

    Index Templates可以帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到 新创建的索引之上。模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引,你可以设定多个索引模版,这些设置会被“merge”在一起,你可以指定“order”的数值,控制“

    2024年02月15日
    浏览(39)
  • 模板匹配Template Matching

     实现代码: 运行结果:

    2024年02月11日
    浏览(45)
  • 模板方法模式(Template Method)

    模板方法模式是一种行为设计模式,在超类中定义了一个算法的框架,而将一些步骤的实现延迟到子类中,使得子类可重定义该算法的特定步骤。 模板方法模式包含如下角色: Abstract ­Class,抽象类,实现一个模板方法,定义了算法的骨架。需要说明的是,算法中的步骤可以

    2024年02月14日
    浏览(97)
  • Django学习笔记-模板(Template)基础

    使用模块可以很方便的执行一些数据操作,然后根据传入的数据直接在模板html文件中进行处理。 Django的模板引擎在sttings.py文件中: Django模板引擎中使用“{% %}”来描述python语句,使用“{{ }}”来描述变量,常用语句示例说明如下: 标签 说明 {% extends \\\"模板名\\\" %} 扩展一个母模

    2024年02月15日
    浏览(38)
  • Gee教程6.模板(HTML Template)

    这一章节的内容是介绍 Web 框架如何支持 服务端渲染 的场景 实现静态资源服务(Static Resource)。 支持HTML模板渲染。 这一章节很多内容是基于net/http库的,该库已经实现了很多静态文件和HMML模板的相关功能的了。 网页的三剑客,JavaScript、CSS 和 HTML。要做到服务端渲染,第一步

    2024年02月04日
    浏览(49)
  • 设计模式第15讲——模板模式(Template)

    模板模式是一种基于 继承 实现的设计模式,它是 行为型 的模式。 主要思想是将定义的算法抽象成一组步骤,在抽象类种定义算法的骨架,把具体的操作留给子类来实现。 通俗地说,模板模式就是将某一行为制定一个框架,然后子类填充细节。比如说做菜,流程通常就是洗

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包