首页 > 编程语言 >C++模板的显式具体化

C++模板的显式具体化

时间:2024-03-14 22:37:51浏览次数:27  
标签:const 函数 显式 C++ STU 具体化 类型 模板

C++ 模板

C++ 没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。

例如有下面的函数模板,它用来获取两个变量中较大的一个:

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

请读者注意a > b这条语句,>能够用来比较 int、float、char 等基本类型数据的大小,但是却不能用来比较结构体变量、对象以及数组的大小,因为我们并没有针对结构体、类和数组重载>

另外,该函数模板虽然可以用于指针,但比较的是地址大小,而不是指针指向的数据,所以也没有现实的意义。

除了>+-*/==<等运算符也只能用于基本类型,不能用于结构体、类、数组等复杂类型。总之,编写的函数模板很可能无法处理某些类型,我们必须对这些类型进行单独处理。

模板是一种泛型技术,它能接受的类型是宽泛的、没有限制的,并且对这些类型使用的算法都是一样的(函数体或类体一样)。但是现在我们希望改变这种“游戏规则”,让模板能够针对某种具体的类型使用不同的算法(函数体或类体不同),这在 C++ 中是可以做到的,这种技术称为模板的显示具体化

函数模板和类模板都可以显示具体化,下面我们先讲解函数模板的显示具体化,再讲解类模板的显示具体化。

函数模板的显式具体化

在讲解函数模板的显示具体化语法之前,我们先来看一个显示具体化的例子:

#include <iostream>
#include <string>
using namespace std;

typedef struct{
    string name;
    int age;
    float score;
} STU;

//函数模板
template<class T> const T& Max(const T& a, const T& b);
//函数模板的显示具体化(针对STU类型的显示具体化)
template<> const STU& Max<STU>(const STU& a, const STU& b);
//重载<<
ostream & operator<<(ostream &out, const STU &stu);

int main(){
    int a = 10;
    int b = 20;
    cout<<Max(a, b)<<endl;
   
    STU stu1 = { "王明", 16, 95.5};
    STU stu2 = { "徐亮", 17, 90.0};
    cout<<Max(stu1, stu2)<<endl;
    return 0;
}

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

template<> const STU& Max<STU>(const STU& a, const STU& b{
    return a.score > b.score ? a : b;
}

ostream & operator<<(ostream &out, const STU &stu){
    out<<stu.name<<" , "<<stu.age <<" , "<<stu.score;
    return out;
}

 

标签:const,函数,显式,C++,STU,具体化,类型,模板
From: https://www.cnblogs.com/uacs2024/p/18074173

相关文章

  • KTL 一个支持C++14编辑公式的K线技术工具平台 - 第九版,数据分析工具。支持通达信日线
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL国内仓库:https://gitee.com/bbqz007/KTL CoreAnimationforWindows: https://github.com/bbqz007/xwzqt5 一个超简单的Qt5窗口语法: https://gith......
  • (C++)二分
    二分​ 二分,他可以应用的范围特别广,即使是你想不到的地方他也可以二分。​ 例如:Acwing790数的三次方根这题可以直接二分题目所要求的答案,通过不断逼近三次方后的结果来二分;Acwing5407.管道,这题里可以直接二分时间,然后合并区间查看是否满足;Acwing730.机器人跳跃问题可以......
  • C++ | 蓝桥题库区间或(位运算)
    一开始看题解很晕,这里采用前缀和方式的思想是:按位贡献,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。(1<<w)1左移w位相当于2的w次方,prefix[w][r]-prefix[w][l-1]相当于[l,r]这段距离上有1就让ans加上1,没有就不加。#inc......
  • jinja2模块模板语法 django基础
    jinja2去数据库中获取数据,传递给HTML页面,借助于模板语法发送给浏览器还能帮你简单方便的操作字典去后端获取数据库中数据展示到前端页面importpymysqldefget_user(env):去数据库中获取数据,传递给HTML页面,借助于模板语法发送给浏览器还能帮你简单方便的操作字典......
  • C++函数模板的实参推断
    C++模板在使用类模板创建对象时,程序员需要显式的指明实参(也就是具体的类型)。例如对于下面的Point类:template<typename T1, typename T2> class Point;我们可以在栈上创建对象,也可以在堆上创建对象:Point<int, int> p1(10, 20);  //在栈上创建对象Point<char*, c......
  • 线段树模板
    线段树模板沉淀了很久,总算是掌握了线段树的经典模板了。但是还是需要深刻练习才能反复加深印象呢//线段树模板#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;intans[N*4];intt1[N*4],t2[N*4];inta[N];//存放输入数据intn,......
  • 归并排序、快速排序——左神数据结构与算法Day2学习笔记C++版本(持续更新)
    递归行为        利用递归求整个数组的最大值,代码如下。intfind_Max(inta[],intL,intR){if(L==R){returna[L];}intmid=L+((R-L)>>1);//mid是数组的中点intleftMax=find_Max(a,L,mid);intrightMax......
  • C++并发编程:线程池学习
    文章目录一、线程池的概念二、线程池的设计三、线程池的实现1、ThreadPool声明2、线程创建3、添加任务4、ThreadPool析构四、相关知识点1、emplace_back和push_back2、typenamestd::result_of<F(Args...)>::type3、std::packaged_task<return_type()>4、函数模板和......
  • C/C++ vscode 配置
    一、由于vscode本身不带有编译器,需要下载MinGW编译器 打开网站:MinGW-w64-for32and64bitWindows-Browse/mingw-w64/mingw-w64-releaseatSourceForge.net下载x86_64-win32-seh版本下载后,解压缩,把解压缩后的文件剪切奥C:\ProgramFiles把路径C:\ProgramFiles......
  • C++函数模板的重载
    C++模板当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。我们定义了Swap(......