C++函数模板的使用详解

函数模板可以适用泛型来定义函数,其中泛型可以是(int, double, float)等替换。在函数重载过程中,通过将类型作为参数传递给模板,可使编译器自动产生该类型的函数。

工作原理:比如需要定义一个比大小的max函数,有三种类型的数据(int,double,float),可能就需要编写三个函数,这样既浪费时间,且容易出错。如:

#include <iostream>

using namespace std;

int Max(int a, int b);
double Max(double x, double y);
float Max(float s, float t);

int main()
{
    cout << Max(1, 2) << endl;

    cout << Max(3.0, 4.0) << endl;

    cout << Max(5.23, 5.24) << endl;

    return 0;
}

int Max(int a, int b)
{
    return a > b ? a : b;
}

double Max(double x, double y)
{
    return x > y ? x : y;
}

float Max(float s, float t)
{
    return s > t ? s : t;
}

结果如下:

从上面就可以看出一个很简单的比较大小的函数,居然写的这么繁琐,显然增加了工作量,极大降低了工作效率,因此,函数模板的出现十分有效的解决了这个问题。函数模板允许以任意类型的方式定义函数,有两种形式例如:

形式1:

template <typename Anytype> //template是函数模板的关键字
void Swap(Anytype &a,Anytype &b)
{
    Anytype temp;
    temp=a;
    a=b;
    b=temp;
}

形式2:

template <class Anytype> //class是函数模板的关键字
void Swap(Anytype &a,Anytype &b)
{
    Anytype temp;
    temp=a;
    a=b;
    b=temp;
}

 使用函数模板之后的代码如下:

形式1 :

#include <iostream>

using namespace std;

template <typename T>
T Max(T a, T b);
/* double Max(double x, double y);
float Max(float s, float t); */

int main()
{
    cout << Max(1, 2) << endl;

    cout << Max(3.0, 4.0) << endl;

    cout << Max(5.23, 5.24) << endl;

    return 0;
}

template <typename T>
T Max(T a, T b)
{
    return a > b ? a : b;
}

 形式2:

#include <iostream>

using namespace std;

template <class T>
T Max(T a, T b);

int main()
{
    cout << Max(1, 2) << endl;

    cout << Max(3.0, 4.0) << endl;

    cout << Max(5.23, 5.24) << endl;

    return 0;
}

template <class T>
T Max(T a, T b)
{
    return a > b ? a : b;
}

结果如下:

对比之下,明显精简了很多。

到此这篇关于C++函数模板的使用详解的文章就介绍到这了,更多相关C++函数模板内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中函数模板的用法详细解析

    定义 我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义.这样可以简化函数的调用形式,但是程序中,仍然需要分别定义每一个函数. C++提供的函数模板可以更加简化这个过程. 所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板. 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可.在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能

  • C++函数模板与类模板实例解析

    本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库). 模板(template)是泛型编程的基础,一个模板就是一个创建类或函数的蓝图或公式.例如,当使用一个vector这样的泛型类型或者find这样的泛型函数

  • 深入解析C++中的函数模板和函数的默认参数

    C++函数模板 我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值.这就是数据的参数化. 其实,数据类型也可以通过参数来传递,在函数定义是可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的参数自动确定数据类型.这就是数据类型参数化. 所谓函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替(实际上是用一个标识符来占位).这个通用函数就称为函数模板(Function Template).凡是函数

  • 简单掌握C++中的函数模板

    1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板的声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 } 其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,

  • C++函数模板的使用详解

    函数模板可以适用泛型来定义函数,其中泛型可以是(int, double, float)等替换.在函数重载过程中,通过将类型作为参数传递给模板,可使编译器自动产生该类型的函数. 工作原理:比如需要定义一个比大小的max函数,有三种类型的数据(int,double,float),可能就需要编写三个函数,这样既浪费时间,且容易出错.如: #include <iostream> using namespace std; int Max(int a, int b); double Max(double

  • Android开发之Android.mk模板的实例详解

    Android开发之Android.mk模板的实例详解 关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考. 本模板主要给大家示例 Android NDK 开发中的如下几个问题: 1. 如何自动添加需要编译的源文件列表   2. 如何添加第三方静态库.动态库的依赖   3. 如何构造一个完整的NDK工程框架 假设我们的项目依赖 libmath.a, libjson.a, libffmp

  • python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题:(至于为什么是在numpy.lib.shape_base中,我还是不太清楚.) 其实tile就是重复的意思,把一个数组a,当做模板,重复几次,生成另一个数组b 至于矩阵可以不以这样,还没有试过. 例子: 创建一个a,使用tile来创建b from numpy import * a=[0,1,2]

  • Go模板template用法详解

    本文只介绍template的语法和用法,关于template包的函数.方法.template的结构和原理,见:深入解析Go template模板使用详解. 入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-

  • Vue3使用hooks函数实现代码复用详解

    目录 前言 VUE2我们是怎么做的呢? VUE3中我们怎么处理复用代码逻辑的封装呢? 说那么多,不如直接上代码来看差异 前言 项目开发过程中,我们会遇到一些情况,就是多个组件都可以重复使用的一部分代码逻辑,功能函数,我们想要复用,这可怎么办呢? VUE2我们是怎么做的呢? 在vue2 中有一个东西:Mixins 可以实现这个功能 mixins就是将这些多个相同的逻辑抽离出来,各个组件只需要引入mixins,就能实现代码复用 弊端一: 会涉及到覆盖的问题 组件的data.methods.filte

  • vue2从template到render模板编译入口详解

    目录 正文 1.template:模板获取 2.createCompiler:核心参数 3.createCompileToFunctionFn:缓存处理 4.compile:参数合并 小结 正文 在vue的渲染过程中,渲染核心逻辑是vm._update(vm._render(), hydrating),通过vm._render的执行获取到vNode,再通过vm._update的执行来将vNode渲染成真实视图. 其中,render函数的来源是: (1)用户手写: (2)通过vue-loader引

  • Django视图层与模板层实例详解

    目录 theme: channing-cyan 网页伪静态 视图层 1.视图函数的返回值问题 2.视图函数返回json格式数据 3.form表单携带文件数据 4.FBV与CBV 5.CBV源码分析 模板层 1.模板语法传值 2.模板语法传值的范围 3.模板语法值过滤器 4.模板语法标签(类似于python中的流程控制) 5.自定义标签函数.过滤器.inclusion_tag 6.模板的继承 7.模板的导入 theme: channing-cyan 网页伪静态 将动态网页伪装成静态网页,可以提升网

  • C++印刷模板使用方法详解

    目录 一.泛型编程 二.模板(初阶) 1.函数模板 1.单参数类型 2.多参数类型 3.模板函数和自定义函数 2.类模板 3.模板不支持分离编译 在了解string之前,我们需要了解模板等等的一些铺垫知识,让我们开始吧! 一.泛型编程 泛型编程是什么意思呢?我们通过下面的例子来具体了解: void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double&

  • C++中回调函数及函数指针的实例详解

    C++中回调函数及函数指针的实例详解 如何获取到类中函数指针 实现代码: //A类与B类的定义 class A { public: void Test() { cout << "A::Test()" << endl; } }; class B : public A { public: void Test() { cout << "B::Test()" << endl; } }; //定义类的成员函数指针 typedef

  • PHP中的函数声明与使用详解

      函数 1.  函数名是标识符之一,只能有字母数字下划线,开头不能是数字: 函数名的命名,必须符合"小驼峰法则"FUNC(),func(),Func(); 函数名不区分大小写; 函数名不能与已有函数同名,不能与内置函数名同名: 2.   function_exists("func");用于检测函数是否已经声明: 注意传入的函数名,必须是字符串格式,返回结果为true/false: echo打印时,true为1,false不显示:               [ph

随机推荐