广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++函数模板如何使用
  • 164
分享到

C++函数模板如何使用

2023-07-05 08:07:30 164人浏览 泡泡鱼
摘要

本篇内容介绍了“c++函数模板如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C++函数模板template<typename&

本篇内容介绍了“c++函数模板如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

C++函数模板

template<typename T>void Swap(T &a ,T &b){    T temp;    temp = a;    a = b;    b = temp;}

在使用模板函数时,编译器根据实际的类型生成相应的函数定义。

重载的模板

并非所有的类型都使用相同的算法,可以像重载常规函数那样重载模板函数定义。

template<typename T>void Swap(T &a ,T &b); //#1template<typename T>void Swap(T *a ,T *b,int n);//#2 最后一个参数是具体类型int main(){    int i =10,j=20;    Swap(i,j);//使用#1        const int Lim = 8;    int d1[Lim]={0,1,2,3,4,5,6,7};    int d2[Lim]={7,6,5,4,3,2,1,0};    Swap(d1,d2,Lim);//使用#2}template<typename T>void Swap(T &a ,T &b){    T temp;    temp = a;    a = b;    b = temp;}template<typename T>void Swap(T *a ,T *b,int n){    T temp;    for(int i=0;i<n;i++)    {        temp =a[i];        a[i]=b[i];        b[i]=temp;    }}

模板局限性

某些时候,类型T的相应操作只适用于数组,如果T为结构体则模板函数便不成立

同样,如if(a>b),如果T为结构,则>便不成立

解决方案:

  • 重载运算符号

  • 为特定类型提供具体化模板定义

显示具体化

当编译器找到与函数调用匹配的具体化定义时,将使用该定义,不再寻找模板。

  • 对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及各自的重载版本。

  • 显示具体化的原型和定义以template<>开头,并通过名称来指出类型

  • 调用顺序是:非模板函数>具体化模板函数>模板函数

void Swap(job& ,job&);template <typename T>void Swap(T&,T&);template<> void Swap<job>(job& ,job&);//显示具体化//Swap<job>中<job>是可选的,因为函数的参数类型表明,这是job的一个具体化,所以也可以这样写:template<> void Swap(job& ,job&);

实例化和具体化

注意:函数模板并不会生成函数定义,他只是生成一个用于生成函数定义的方案,编译器使用模板为特定的类型生成函数定义时,得到的是模板实例。

template<typename T>void Swap(T &a ,T &b);int a =10,b=20;Swap(a,b);//因为提供了int类型的参数,所以自动生成了int类型的模板实例。这样是==隐式实例化==//也可以直接命令编译器创建特定的实例//显示实例化template void Swap<int>(int &,int &);//使用Swap()模板生成int类型的函数定义//显示具体化template<> void Swap<int>(int& ,int&);template<> void Swap(int& ,int&);//区别在于:具体化是不使用Swap()模板函数生成函数定义,而是使用专门为int类型显示定义的函数定义//简单的理解,具体化是对函数的声明,而实例化是对模板函数的使用
template<typename T>T Add(T a,T b){    return a+b;}int m=6;double x=10.5;Add<double>(x,m); //与Add(x,m)不匹配,因为一个是int一个是double  //通过Add<double>实例化,可强制将m转为double//但是同样的对Swap便不能成功,因为Swap中使用的是引用类型Swap<double>(m,x);//double& 不能指向int
//使用案例template <typename T>void Swap(T &,T &);template<> void Swap<job>(job&,job&);//具体化int mian(){    template void Swap<char>(char& ,char&);        short a,b;    Swap(a,b);//隐式实例化        job n,m;    Swap(n,m);//显示具体化        char g,h;    Swap(g,h);//显示实例化}

模板函数类型的确定

template<class T1,class T2>void fun(T1 x,T2 y){    ?type? s=x+y; //因为是模板函数,此时?type?类型不确定}

C++11增加decltype关键字

template<class T1,class T2>void fun(T1 x,T2 y){    decltype(x+y) s=x+y; //s类型与x+y的类型一致}

使用decltype(expression) var 的步骤:

如果expression没有用括号括起来,则var与expression类型相同,包括const等限定符

double x =5.5;double& z =x;const double* pd;decltype(x) w; //w为double类型decltype(z) u; //u为double& 类型decltype(pd) v; //v为const double* 类型

如果expression是一个函数调用,则var与返回值类型相同。并不会实际调用函数,编译器通过查看原型来确定返回值类型

如果expression是一个左值,则var为指向其类型的引用。常见的情况如下:

double x = 4.5;decltype((x)) r = x;//r是double&类型decltype(x) r = x;//r是double类型//括号不会改变expression的值和左值性//可理解为加括号仅仅是decltype声明引用的一种方式

如果前3条都不满足,则var与expression类型相同

int j=3;int &k=j;int &n=j;decltype(j+6) x; //x是intdecltype(k+n) y;//y是int ,虽然k和n是引用,但是k+n不是引用是2个int的和

如果多次声明,可以结合typedefdecltype

typedef decltype(x+y) xytype;xytype z = x+y;xytype arr[10];

但是某些需定义返回值类型的函数模板任然不能得到解决,如:

template<class T1,class T2>?type? fun(T1 x,T2 y) //此时无法确定类型{    return x+y;}

C++新增语法auto h(int x,float y) -> double,这称为后置返回类型,auto是一个占位符

template<class T1,class T2>auto fun(T1 x,T2 y)->decltype(x+y) //后置类型使用decltype{    return x+y;}

“C++函数模板如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++函数模板如何使用

本文链接: https://www.lsjlt.com/news/350550.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++函数模板如何使用
    本篇内容介绍了“C++函数模板如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C++函数模板template<typename&...
    99+
    2023-07-05
  • C++函数模板的使用详解
    函数模板可以适用泛型来定义函数,其中泛型可以是(int, double, float)等替换。在函数重载过程中,通过将类型作为参数传递给模板,可使编译器自动产生该类型的函数。 工作原...
    99+
    2022-11-12
  • C++函数模板和类模板分析
    本篇内容介绍了“C++函数模板和类模板分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.函数模板函数模板定义了参数化的非成员函数,这使得...
    99+
    2023-06-17
  • C++ 函数模板和类模板详情
    目录1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模...
    99+
    2022-11-12
  • 浅析C++函数模板和类模板
    目录一、函数模板1、函数模板的定义和使用2、函数模板的编译原理3、函数模板的声明二、类模板1、类模板的定义和使用2、类模板的编译原理3、类模板的继承和派生C++语言全盘继承了C语言的...
    99+
    2022-11-13
  • C++函数模板怎么应用
    本篇内容介绍了“C++函数模板怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C++函数模板学习指南C++函数模板是一种高效的代码复用...
    99+
    2023-07-06
  • C++泛型编程函(数模板+类模板)
    目录一、函数模板1.函数模板介绍2.函数模板与重载函数的关系3.函数模板实现机制二、类模板1.类模板基本语法2.类模板内函数的整体布局【分文件使用类模板】3.类模板的static与模...
    99+
    2022-11-13
  • 【C++奇遇记】函数模板
    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏...
    99+
    2023-09-02
    c++ 开发语言
  • C++模板如何使用
    这篇文章主要讲解了“C++模板如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++模板如何使用”吧!一、函数模板1.1函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在...
    99+
    2023-07-02
  • C++学习之函数模板的使用详解
    目录C++函数模板重载的模板模板局限性显示具体化实例化和具体化模板函数类型的确定C++函数模板 template<typename T> void Swap(T &...
    99+
    2023-03-02
    C++函数模板使用 C++函数模板 C++函数
  • C++模板基础之函数模板与类模板实例详解
    目录泛型编程 函数模板 函数模板的概念 函数模板的格式 函数模板的原理 函数模板的实例化 函数模板的匹配原则 类模板 类模板的定义格式 类模板的实例化 总结泛型编程  ...
    99+
    2022-11-12
  • C++的模板如何使用
    这篇文章主要介绍“C++的模板如何使用”,在日常操作中,相信很多人在C++的模板如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的模板如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一....
    99+
    2023-07-02
  • C++ 类模板与成员函数模板示例解析
    目录类模板类模板与成员函数模板的区别类模板 前面以函数模板为例,介绍了具体化与实例化。那么对于类模板,有什么不同呢? 类包括成员变量和成员函数,他们都可以包含类模板的模板参数。而成...
    99+
    2023-01-03
    C++ 类模板成员函数模板 C++ 类模板成员函数模板
  • C++类模板与函数模板基础详细讲解
    目录函数模板类模板总结函数模板 当我们想要定义一个可以支持泛型的函数时,就要采用函数模板的方式了。所谓泛型就是可以支持多种类型的操作,比如我们定义一个compare操作,他可以根据传...
    99+
    2022-11-13
    C++类模板 C++函数模板
  • 详解C++中函数模板的定义与使用
    目录1. 前言2. 初识函数模板2.1 语法2.2 实例化2.3 实参推导3. 重载函数模板1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板。 如果现在...
    99+
    2022-11-13
  • C++使用宏函数实现单例模板详解
    目录ISingleton.hpp使用方式Aclass.hAclass.cppmain.c在我们日常开发中,无可避免需要使用单例模式进行设计类对象,那么实际上我们写单例格式基本都是一样...
    99+
    2023-02-10
    C++宏函数实现单例模板 C++ 单例模板 C++宏函数
  • C++11模板函数的默认模板参数举例分析
    这篇文章主要介绍“C++11模板函数的默认模板参数举例分析”,在日常操作中,相信很多人在C++11模板函数的默认模板参数举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11模板函数的默认模板参数举...
    99+
    2023-06-19
  • 如何使用c++模板自定义数组
    这篇文章主要介绍了如何使用c++模板自定义数组,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言:制造通用模板,创建自定义的数组,一个数组,里面有这么几个属性,数组容量,数组...
    99+
    2023-06-29
  • C++中如何使用链栈模板
    本篇文章给大家分享的是有关C++中如何使用链栈模板,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++链栈模板声明template <class T&...
    99+
    2023-06-17
  • 【C++】详细介绍模版初阶—函数模版、类模板
    文章目录 一、泛型编程二、函数模版2.1 函数模版概念2.2 函数模版格式2.3 函数模版的原理2.4 函数模版的实例化2.5 函数模版的匹配原则 三、类模版3.1 类模版定义3.2 类模...
    99+
    2023-09-02
    c++ 前端
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作