C++之Args可变参数模板总结(二百五十二)

news2024/12/23 8:11:55

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之Args可变参数模板用法。

2.Args可变参数模板介绍

  • C++中,Args是一个通用的模板参数,用于表示一个参数包。它可以用于函数模板、类模板以及其他支持模板参数的上下文中。

Args通常用于以下两种情况:

1. **函数模板参数包在函数模板中,Args可以表示一个参数包,用于接受任意数量的参数。通过使用参数包展开的方式,可以在函数模板中处理不定数量的参数。

   template <typename... Args>
   void PrintArgs(Args... args) {
     ((std::cout << args << " "), ...);
   }

Args表示一个参数包,可以接受任意数量的参数。通过折叠表达式(std::cout << args << " "),我们可以依次打印出每个参数。

2. 类模板参数包在类模板中,Args可以表示一个参数包,用于接受多个类型参数。通过使用参数包展开的方式,可以在类模板中处理多个类型参数。

   template <typename... Args>
   class Tuple {
   public:
     Tuple(Args... args) {
       // 构造函数逻辑
     }
   };

Args表示一个参数包,用于接受多个类型参数。在类模板的构造函数中,我们可以使用参数包来接受多个参数,并在构造函数的逻辑中进行处理。

3.总结:

Args是一个通用的模板参数,用于表示一个参数包。它可以用于函数模板、类模板以及其他支持模板参数的上下文中,用于接受任意数量的参数或多个类型参数。通过使用参数包展开的方式,可以在模板中处理不定数量的参数或多个类型参数。

3.代码实例

1.使用函数指针调用成员函数

#include <iostream>

class MyClass {
public:
  void MyFunction(int a, float b) {
    std::cout << "a: " << a << ", b: " << b << std::endl;
  }
};

int main() {
  MyClass obj;
  void (MyClass::*member)(int, float) = &MyClass::MyFunction;
  (obj.*member)(10, 3.14f);
  return 0;
}

定义了一个名为MyClass的类,其中包含一个成员函数MyFunction。然后,我们声明了一个函数指针member,它指向MyFunction函数。最后,我们通过对象指针和函数指针来调用成员函数,传递参数10和3.14f。运行这个程序会输出a: 10, b: 3.14。

2.使用函数参数包传递任意数量的参数

#include <iostream>

template <typename... Args>
void PrintArgs(Args... args) {
  std::cout << "Number of arguments: " << sizeof...(args) << std::endl;
  std::cout << "Arguments: ";
  ((std::cout << args << " "), ...);
  std::cout << std::endl;
}

int main() {
  PrintArgs(10, "Hello", 3.14f);
  return 0;
}

定义了一个模板函数PrintArgs,它接受任意数量的参数,并打印出参数的数量和值。我们使用折叠表达式(std::cout << args << " ")来依次打印每个参数。在main函数中,我们调用PrintArgs函数,并传递参数10,"Hello"和3.14f。运行这个程序会输出Number of arguments: 3和Arguments: 10 Hello 3.14。

3.模板函数调用类中的成员函数

#include <iostream>

class TEST {
public:
  void print_test(int a, float b) {
    std::cout << "a: " << a << ", b: " << b << std::endl;
  }
};


//v1.0: 不使用template模板和Args
void call0(TEST* obj, void (TEST::*member)(int a, float b), int x , int y) {
  (obj->*member)(std::forward<int>(x), std::forward<int>(y));
}

//v2.0: 使用template模板,但是不使用Args
template <typename... Args>
void call(TEST* obj, void (TEST::*member)(int a, float b), Args... args) {
  (obj->*member)(std::forward<Args>(args)...);
}

//v3.0 使用Args变长参数
//obj:表示TEST对象;
//TEST::*member:表示TEST类成员函数
//Args... args: 表示成员函数参数
template <typename... Args>
void call1(TEST* obj, void (TEST::*member)(Args...), Args... args) {
  (obj->*member)(std::forward<Args>(args)...);
}



int main() {
  /*
    obj:表示TEST对象,对应真正的对象:&obj0.
    TEST::*member:表示TEST类成员函数,对应真正的函数&TEST::print_test()
    Args... args: 表示成员函数参数 ,对应真正的参数11, 0.34.
  */
  //v1.0
  TEST obj0;
  call(&obj0, &TEST::print_test, 11, 0.34);

  //v2.0
  TEST obj;
  call(&obj, &TEST::print_test, 23, 0.11);


  //v3.0
  TEST obj1;
  call1(&obj, &TEST::print_test, 133, 3.14f);

  //v4.0
  TEST obj2;
  void (TEST::*print)(int, float) = &TEST::print_test;
  (obj.*print)(100, 4.34);

  return 0;
}




定义了一个名为TEST类,其中包含一个成员函数print_test。然后,我们使用模板函数call来调用print_test函数,并传递参数10和3.14f。运行这个程序会输出a: 10, b: 3.14。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文解读WordPress网站的各类缓存-老白博客

缓存是一种重要的WordPress优化手段&#xff0c;用于提高网站的性能和加载速度。减少计算量&#xff0c;有效提升响应速度&#xff0c;让有限的资源服务更多的用户。本文老白博客便从自己的使用简单给大家介绍下WordPress的缓存&#xff0c;包括 站点缓存&#xff08;Page Cach…

C语言——输入 10 个学生的姓名、学号和成绩,将其中不及格者的姓名、学号和成绩输出

完整代码&#xff1a; // 输入 10 个学生的姓名、学号和成绩&#xff0c;将其中不及格者的姓名、学号和成绩输出 #include<stdio.h> //学生的个数 #define N 10 struct Student {char name[20];int id;int grade; };int main(){//定义学生结构体数组struct Student stu[…

【C++笔记】C++多态

【C笔记】C多态 一、多态的概念及实现1.1、什么是多态1.2、实现多态的条件1.3、实现继承与接口继承1.4、多态中的析构函数1.5、抽象类 二、多态的实现原理 一、多态的概念及实现 1.1、什么是多态 多态的概念&#xff1a; 在编程语言和类型论中&#xff0c;多态&#xff08;英…

零基础Linux_24(多线程)线程同步+条件变量+生产者消费模型_阻塞队列版

目录 1. 线程同步和生产者消费者模型 1.1 生产者消费者模型的概念 1.2 线程同步的概念 1.3 生产者消费者模型的优点 2. 线程同步的应用 2.1 条件变量的概念 2.2 条件变量操作接口 3. 生产者消费者模型_阻塞队列 3.1 前期代码&#xff08;轮廓&#xff09; 3.2 中期代…

Starknet开发工具

1. 引言 目前Starknet的开发工具流可为&#xff1a; 1&#xff09;Starkli&#xff1a;音为Stark-lie&#xff0c;为替换官方starknet-CLI的快速命令行接口。Starkli为单独的接口&#xff0c;可独自应用&#xff0c;而不是其它工具的组件。若只是想与Starknet交互&#xff0…

C语言 定义一个函数,并调用,该函数中打印显示直角三角形

#include<stdio.h> void chengfabiao() {for (int i 1; i < 5; i){for (int j 1; j < i; j){printf("*");} printf("\n");} } int main(int argc,const char *argv[]) {chengfabiao();return 0; }

leetCode 136.只出现一次的数字 + 位运算

136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算…

SpringBoot面试题8:运行 Spring Boot 有哪几种方式?Spring Boot 需要独立的容器运行吗?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:运行 Spring Boot 有哪几种方式? 运行Spring Boot应用有多种方式,具体取决于你的需求和环境。以下是几种常见的运行Spring Boot应用的方式: 使…

Ubuntu学习---跟着绍发学linux课程记录(第4部分)

第3部份内容记录在&#xff1a;Ubuntu学习—跟着绍发学linux课程记录&#xff08;第3部分&#xff09; 文章目录 14 ubuntu服务器上的java14.1 Java的安装14.2 运行java程序14.3 Java启动脚本 15 ubuntu服务器上的tomcat15.1 Tomcat服务器15.2 Tomcat的配置15.3 Tomcat启动日志…

【多线程面试题十一】、如何实现子线程先执行,主线程再执行?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;如何实现子线程先执行&a…

beyond compare 4密钥2023大全,beyond compare 4注册码最新

beyond compare 4是一款文件对比软件&#xff0c;可以快速比较文件和文件夹、合并以及同步&#xff0c;非常实用&#xff0c;一些用户想知道beyond compare 4密钥有哪些&#xff0c;本文为大家带来了介绍哦~ 密钥&#xff1a; w4G-in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwf…

redis原理 主从同步和哨兵集群

主从库如何实现数据一致 我们总说的 Redis 具有高可靠性&#xff0c;又是什么意思呢&#xff1f;其实&#xff0c;这里有两层含义&#xff1a;一是数据尽量少丢失&#xff0c;二是服务尽量少中断。AOF 和 RDB 保证了前者&#xff0c;而对于后者&#xff0c;Redis 的做法就是增…

微服务框架Consul--新手入门

Consul Consul 是由 HashiCorp 开发的一款软件工具&#xff0c;提供了一组功能&#xff0c;用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能&#xff1a; 服务发现&#xff1a;Consul …

[Python]unittest-单元测试

目录 unittest的大致构成: Test Fixture Test Case-测试用例 Test Suite-测试套件 Test Runner 批量执行脚本 makeSuite() TestLoader discover() 用例的执行顺序 忽略用例执行 skip skipIf skipUnless 断言 HTML测试报告 错误截图 unittest是python中的单元测…

禁用Google Chrome自动升级、查看Chrome版本号

问题 查看Chrome版本时&#xff0c;会自动升级&#xff0c;这个设计很垃圾,对开发者不友好&#xff1b;查看Chrome版本方法&#xff1a;chrome浏览器右上角—>自定义及控制Google Chrome(三个竖着的点号)------>帮助---->关于Google Chrome。 解决办法 禁用自动升级…

二叉树题目合集(C++)

二叉树题目合集 1.二叉树创建字符串&#xff08;简单&#xff09;2.二叉树的分层遍历&#xff08;中等&#xff09;3.二叉树的最近公共祖先&#xff08;中等&#xff09;4.二叉树搜索树转换成排序双向链表&#xff08;中等&#xff09;5.根据树的前序遍历与中序遍历构造二叉树&…

木疙瘩文字变形动画

H5-大 第一步 创建文字到新动画图层 第二步&#xff1a;直接在时间末尾插入变形动画帧 文字专属的参数和形状变化一样都是变形动画才可以动起来&#xff01;关键帧动画主要服务元件&#xff01; 第三步&#xff1a;改变文字参数即可&#xff01;

苍穹外卖-day03

苍穹外卖-day03 课程内容 公共字段自动填充新增菜品菜品分页查询删除菜品修改菜品 **功能实现&#xff1a;**菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在…

Linux C/C++ 实现网络流量分析(性能工具)

网络流量分析的原理基于对数据包的捕获、解析和统计分析&#xff0c;通过对网络流量的细致观察和分析&#xff0c;帮助管理员了解和优化网络的性能、提高网络安全性&#xff0c;并快速排查和解决网络故障和问题。 Linux中的网络流量常见类型 在Linux中&#xff0c;网络流量可以…

数组与链表算法-链表与多项式

目录 数组与链表算法-链表与多项式 多项式链表表示法 C代码 数组与链表算法-链表与多项式 使用链表的最大好处就是减少内存的浪费&#xff0c;并且能增加使用上的弹性。例如数学上常用的多项式表示法&#xff0c;虽然可以使用数组方式来处理&#xff0c;但当数据内容变动时…