C++不定参数,模板函数,模板类详解附实例

2023-11-14

前言

在 C++ 中,有时我们在写一个函数时并不知道参数的数量和类型,这时需要用到不定参数,模板函数。

正文

不定参数

不定参数怎么表示?

对于不定参数的表示,就是三个点,注意是英文的点

...

那么我们在正常使用时函数参数写成这样

funtionType funtionName(typename xxx,...){
    xxxx; // (函数体)
}

其中 typename 与右面不定参数列表的类型相同。如果不定参数前有多个确定类型的参数,那么不定参数类型与最后一个确定类型的参数的类型一样。

那么怎么获取不定参数呢?

获取不定参数需要一个头文件

#include<cstdarg> 

获取不定参数大概分为如下几步

(1)定义 va_list

(2)把 va_list 与可变参数表绑定

(3)获取参数并对参数进行想要的操作

(4)结束参数的获取

代码如下

void test(int count,...)
{
    va_list v;              //定义va_list
    int value;              //用于获取值

    va_start(v,count);      //使v跟可变参数表绑定
    value = va_arg(v, int); //获取可变参数表的参数

    va_end(v);              //结束参数的获取
}

那么就来写一个函数,打印出所有的参数

void showArg(int count,...){
    va_list ap;
    va_start(ap,count);
    cout<<"va_list: ";
    for (int i=0;i<count;++i){
        cout<<va_arg(ap, int)<<" ";
    }
    va_end(ap);
    cout<<endl;
}

模板函数

刚才是不知道参数数量,那现在不知道参数类型怎么办?

这样就要用模板函数,书写格式如下

template<typename T1, typename T2 .....(还可以继续往下写)>

函数可以这样写

T1 sum(T1 a, T2 b)
{
    return (a+b);
}

这样不管是 int float double 还是其他类型,都可以使用这个函数,不需要每个类型都单独写一个函数,降低代码重复性。

模板类

顾名思义,模板类的意思和模板函数差不多,这里面最好的例子就是 cout 和 printf,但是 cout 涉及到了对于 ”<<“符号的处理,这里暂时不讲。printf 可以打印任何类型的变量,那我们就自己写一个 printf。注:printf 肯定还有更底层的函数,这里暂不涉及。(因为你会发现根本看不懂

我直接给出代码

class print{
public:
    template<typename FIRST, typename ...PACK>
    static
    void cppprintf(FIRST first, PACK... params)
    {
        cout << first;
        cppprintf(params...);
    }
    
    template<typename T>
    static
    void cppprintf(T end)
    {
        cout << end << endl;
    }
};

这里我定义了一个 print 类来写函数。首先我们这里定义了一个模板,中间 `...`是我们一开始说的不定参数,下面 cppprintf 函数用了刚才定义的不定模板参数,然后逐个输出,输出完一个就调用自己(递归)输出下一个。下面的是单个参数的情况,直接输出就行。

最后

那么到这里你就掌握了以上知识点,最近也是消失了几个周,其实是去参与了 Developers-Union 的开发,那整篇文章也就结束了,拜拜~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++不定参数,模板函数,模板类详解附实例 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有

随机推荐

  • java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令 JSch 是SSH2的一个纯Java实现 它允许你连接到一个sshd 服务器 使用端口转发 X11转发 文件传输等等 你可以将它的功能集成到
  • 抖音告白代码java,(新版失效)去抖音水印简单分析教程(附带java版代码)

    Python 纯文本查看 复制代码 20200908095807 https www iesdouyin com web api v2 aweme iteminfo item ids 6558232015454342407 ab type
  • 记录下今晚软件测试遇到的大题

    方法如下 测试用例设计方法之边界值分析方法 51Testing软件测试网 软件测试用例分析 习题完美整合版 搜档网 下面是选择排序的程序 其中datalist是数据表 它有两个数据成员 一是元素类型为Element的数组V 另一个是数组大小
  • 安装VS2019 提示 Visual C++ 2015-2019 x64 redistributable安装失败

    最近安装VS2019和UE4的时候总是弹出提示框 忘记截图了 找了张类似的 点击OK之后会弹出下面的对话框 度娘给出茫茫多的解决方案 大部分都是说缺少vc 2015或者vc 2017的相应库 需要先安装低版本库 试了大半天都不能解决 吐血
  • React Native-自定义组件之Slider

    一 背景 最近在进行原生模块改造RN的时候需要用到一个定制的可拖动进度条 但发现react native自带的Slider仅仅是在iOS平台上支持 所以决定自己来定制一个 二 设计思路 组合基础组件和View和Image 搭配PanResp
  • v-model数据绑定到对象的小技巧

    在前面写了v model obj a 后 下面的对象内不用写a这个属性 直接用空对象abj js这类弱语言 会自动将a这个属性set到obj的对象中去 例如 前面绑定了对象中的属性 在后面写对象的时候 可以不写对象属性 直接写一个空对象 在
  • 脑电特征中的微分熵(DE)计算

    最近参加了一个脑电相关的竞赛 其中有一个赛道是情绪识别 根据脑电数据将情绪进行4分类 查了一些文献 使用了包括时域 频域 空间域的一些特征 最后发现微分熵作为特征的分类效果最好 相关参考文献整理下载 https download csdn
  • vcruntime140.dll丢失的解决方法,vcruntime140.dll下载安装教程

    文件vcruntime140 dll需要在电脑打开一个浏览器才能下载顶部输入 dll修复程序 site 按下键盘的回车键打开 然后点击进入下载dll文件安装包 dll文件安装包下载需要点击解压 然后把解压好的文件点击打开 开始安装丢失的vc
  • android 复制文件速度,memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升

    memcpy是C C 的一个标准函数 原型void memcpy void dest const void src size t n 用于从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 neon是
  • 华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA 真题 A卷 B卷 刷的越多 抽
  • 如何使用Blender建3D汉字(保姆级别的详细)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于建模的学习笔记 本篇是如何使用Blender建3D汉字 这是这个专栏的第一篇 因为不知道把这篇放到哪里 就开了个新的 如何使用Blender建3D汉字 就这种的 如果是的话可以接着往下
  • 计算机科学和PYTHON编程导论_15_概率与分布

    随机程序 掷骰子 import random def rollDie 返回一个1 6的随机整数 return random choice 1 2 3 4 5 6 def rollN n result for i in range n res
  • Matlab回归分析

    线性回归 在实际中 对于情况较复杂的实际问题 因素不易化简 作用机理不详 可直接使用数据组建模 寻找简单的因果变量之间的数量关系 从而对未知的情形作预报 这样组建的模型为拟合模型 拟合模型的组建主要是处理好观测数据的误差 使用数学表达式从数
  • 用gdb.attach()在gdb下断点但没停下的情况及解决办法

    在python中 如果导入了pwntools 就可以使用里面的gdb attach io 的命令来下断点 但是这一次鼠鼠遇到了一个情况就是下了断点 但是仍然无法在断点处开始运行 奇奇怪怪 这是我的攻击脚本 我们运行一下 可以看到其实已经运行
  • Python入门--with语句

    with语句 上下文管理器 with语句可以自动管理上下文资源 不论什么原因跳出with块 都能确保文件的正确关闭 以此来达到释放资源的目的 with open 上下文管理器 with open a txt r as file as起个别名
  • Unity3d-游戏中的小地图制作

    方法一 利用NGJ MiniMap插件 1 导入该插件后 在Mesh Version gt Prefabs中 将NJG MiniMap 2D 拖入到场景中 2 在Hierarchy中点击MiniMap 位于NJG MiniMap 2D gt
  • inc si指令的作用_到底什么是链接,它起到了什么作用?

    几十年以前 计算机刚刚诞生 人们编写程序时 将所有的代码都写在同一个源文件中 经过长期的积累 程序包含了数百万行的代码 以至于人们无法维护这个程序了 于是人们开始寻找新的方法 迫切地希望将程序源代码分散到多个文件中 一个文件一个模块 以便更
  • 如何 debug (调试) maven 插件?

    用惯了 IntelliJ IDEA debug 功能 你知道如何在 IntelliJ IDEA 上调试 maven 插件吗 哈哈哈 那就是这篇文章准没错了 1 准备源码 准备你想要进行 debug 的 maven 插件的源代码 我这里以 m
  • ARM常用汇编指令

    目录 一 汇编基本语法 1 汇编指令的最典型书写模式 二 常用汇编指令 1 push压栈指令 2 pop出栈指令 3 sub指令 4 add指令 5 movs数据传输指令 6 str指令 7 ldr指令 8 bl指令 9 MOVW指令 10
  • C++不定参数,模板函数,模板类详解附实例

    前言 在 C 中 有时我们在写一个函数时并不知道参数的数量和类型 这时需要用到不定参数 模板函数 正文 不定参数 不定参数怎么表示 对于不定参数的表示 就是三个点 注意是英文的点 那么我们在正常使用时函数参数写成这样 funtionType