首页 > 编程语言 >C++ 模板编程技术解析

C++ 模板编程技术解析

时间:2023-07-20 18:57:54浏览次数:46  
标签:int C++ Fib template 类型 编程技术 模板 特化

一、函数模板

函数模板实现通用函数,根据传递类型进行编译时实参推导:

template <typename T> 
T add(T a, T b) {
  return a + b;
}

int main() {
  int x = 1, y = 2;
  double m = 1.5, n = 2.5;
  
  int z = add(x, y); 
  double p = add(m, n);

  return 0;  
}

这里template <typename T>声明了一个泛型类型T,然后使用T作为add函数的参数和返回值类型。这使得add可以接受不同类型的a,b,并返回相应类型的和。编译器会根据传参类型实时实例化add。

二、类模板

类模板生成可以根据类型参数化的类:

template <typename T>
class Stack {
private:
  T arr[100];
  int top;
public:
  void push(T);
  T pop(); 
};

int main() {
  Stack<int> s1;
  Stack<double> s2;
  
  s1.push(1);
  s2.push(1.5);

  return 0;
}

类模板的语法类似,template后声明类型参数,然后在类中使用该类型参数,来定义可以通用的类。Stack类就可以因类型T的不同而实例化出Stack, Stack等等。

三、模板特化

模板特化用于自定义某个类型的实现:

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

// 特化int的max实现
template <>
int max<int>(int a, int b) {
  cout << "Int specialization";
  return a > b ? a : b; 
}

int main() {
  int x = 1, y = 2;
  double m = 1.5, n = 2.5;

  max(x, y); //calls int specialization
  max(m, n); //calls original

  return 0;
}

这里使用template<> 的语法,为int类型的max定制了一个专属实现。这让我们不影响原模板的同时,可定制某些特定类型。

四、偏特化

偏特化用于定制模板的部分参数类型:

// 原类模板
template<typename T1, typename T2> 
class Test {
  public:
    T1 value1;
    T2 value2;
    
    Test(T1 v1, T2 v2) {
      value1 = v1;
      value2 = v2;
    }
};

// 偏特化版本,针对T2为int的情况
template<typename T>
class Test<T, int> {
  public:
    T value1;
    int value2;
    
    Test(T v1, int v2) {
      value1 = v1;
      value2 = v2; 
    }
};

int main() {
  
  // 使用原类模板 
  Test<int, double> t1(1, 2.5); 

  // 使用偏特化版本
  Test<double, int> t2(2.3, 5);

  return 0;
}

这样通过一个具体的类定义,就可以更清晰地展示偏特化的用法:

  • 原模板接受两个类型T1和T2
  • 偏特化版本 fixing T2为int类型
  • 根据实参类型不同,分别实例化原类模板和偏特化版本

五、递归模板

模板可以递归调用自己,实现编译期计算:

cppCopy codetemplate<int N>
struct Fib {
  static const int val = Fib<N-1>::val + Fib<N-2>::val;
};

template<>
struct Fib<0> {
  static const int val = 0;  
};

int x = Fib<5>::val; // 编译期计算斐波那契数列

每次实例化时(如Fib<5>),递归调用会展开模板自身,直到终止条件。计算最终在编译期完成。

标签:int,C++,Fib,template,类型,编程技术,模板,特化
From: https://www.cnblogs.com/linxmouse/p/17569366.html

相关文章

  • html 数据可视化大屏展示模板源码分享(第一期)
    1、angular+echart.js统计数据图表读取投屏数据大屏2、生意参谋大数据可视化HTML模板3、大数据可视化展板通用模板4、基于echarts实现的销售统计数据可视化大屏模板5、新能源车联网综合大数据平台6、厅店效能大屏监控看板7、东海省交通大数据分析平台8、基于echarts......
  • 小旋风超级模板站群788套整站html5模板(已经过xxfseo处理)免费下载
    这784套整站模板来源于市面上的html5英文模板,经过机器处理(替换、过滤、精简、压缩)后,生成的。适用于超级模板站群。本来是1千多套的,删除了后台模板、单页模板。剩下784套不错的模板。整站多页面模板。----------------------------------------------------------------------使......
  • C++/C的#pragma参数选项及其解析
    每种C和C++的实现支持对其宿主机或操作系统唯一的功能。例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式。#pragma指示使每个编译程序在保留C和C++语言的整体兼容性时提供不同机器和操作系统特定的功能。编译指示被定义为机器或操作系统特定的,并且......
  • C/C++ 宏获取当前编译程序工作的CPU指令集平台(综合大全覆盖各类CPU)
    参考:https://blog.csdn.net/liulilittle/article/details/126644547?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-126644547-blog-43935465.235%5Ev38%5Epc_relevant_default_base3&dep......
  • Visual Studio新建项目配置好opencv环境,下次打开这个项目后属性管理器显示未加载visua
    配置opencv环境,可参考这篇博客:(82条消息)opencv之visualstudio开发环境配置(属性管理器+环境变量一劳永逸方便开发的配置方式)_opencv官网下载_仙魁XAN的博客-CSDN博客如出现打开这个项目后属性管理器显示未加载visualC++项目,可参考如下方法:1.解决方法:文件→打开→项目/......
  • 反序数c++语言
    1、c语言程序设计将小写字母a到z分别按正序和反序输出2、c语言编程输入正整数,求出其反序数并与原数加和3、c语言编程,输入一个负整数,要求反序输出,注意是负数,各位大侠们,帮帮忙...4、C语言编程,编程实现怎样将一个数组逆序输出?5、C语言编程,写一个函数,使输入的一个字符......
  • Qt/C++音视频开发48-推流到rtsp服务器
    一、前言之前已经打通了rtmp的推流,理论上按照同样的代码,只要将rtmp推流地址换成rtsp推流地址,然后格式将flv换成rtsp就行,无奈直接遇到协议不支持的错误提示,网上说要换成rtp,换了也没用,而且打印了ffmpeg库协议,也是支持的,以为用对应的命令行测试推流到rtsp流媒体服务器地址是可以的,用......
  • LCT 模板
    以P3690为例。#include<iostream>#defineUP(i,s,e)for(autoi=s;i<e;++i)namespaceLCT{//}{{{structNode{ Node*ls,*rs; Node*fa; intsum,val; boolrev; Node();}nil_,*nil=&nil_;Node::Node(){fa=ls=rs=nil;}voidpushup(......
  • c++ day 12
    前几天一直在修改八字循环的包今天和控制接了一下,可以输出转角和速度,希望到时候实车的时候可以一步到位吧。今天开始整数据结构。先来理解线性表线性表(英语:LinearList)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。其中:数据元素的个数n定义为表的长度="l......
  • 建站新手福利:免费网页模板大合集,快速打造专业网站!
    今天给大家带来的网站模板素材,网站类型丰富,包含户外旅行、餐饮、个人网站等等,可以学习和参考其中的布局排版和配色。 ⬇⬇⬇点击获取更多设计资源https://js.design/community?category=design&source=bky&plan=bbqbky772   1、设计公司&工作室相信大家都希望拥有属......