C++之template可变模板参数应用总结(二百二十八)

2023-09-21 21:23:14

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之template可变模板参数应用总结。

1.在C++中,template<typename ... Deps>中的...是一个可变模板参数(variadic template arguments)语法,用于表示可接受零个或多个类型参数的模板。

2.可变模板参数允许我们在使用模板时传递不确定数量的参数,将其展开为模板的多个实参。这样,我们可以在使用模板时灵活地指定任意数量的类型参数,而不限制于固定数量的参数。

2.应用实例

v1.0 打印任意数量的参数

#include <iostream>

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

int main() {
    printValues(1, "hello", 3.14);
    // 输出:1 hello 3.14
    return 0;
}
  • 注意使用模板template<typename … Args>实现打印任意参数功能。

v2.0 计算可变参数的和

#include <iostream>

template<typename ... Args>
auto sumValues(Args ... args) {
    return (args + ...);
}

int main() {
    int sum = sumValues(1, 2, 3, 4, 5);
    // 输出:15
    return 0;
}
  • 注意使用模板template<typename … Args>实现计算可变参数的和功能

v3.0 构造tuple包含不同类型的对象

#include <iostream>
#include <tuple>

template<typename ... Args>
auto createTuple(Args ... args) {
    return std::make_tuple(args...);
}

int main() {
    auto myTuple = createTuple(1, "hello", 3.14);
    // myTuple 的类型为 std::tuple<int, const char*, double>
    return 0;
}
  • 注意使用模板template<typename … Args>实现构造tuple包含不同类型的对象功能

v4.0 展开参数并应用函数

#include <iostream>
#include <functional>

template<typename ... Args>
void applyFunction(std::function<void(Args...)> fn, Args ... args) {
    fn(args...);
}

void printValues(int a, const std::string& b, double c) {
    std::cout << a << " " << b << " " << c << std::endl;
}

int main() {
    applyFunction(printValues, 1, "hello", 3.14);
    // 输出:1 hello 3.14
    return 0;
}
  • 注意使用模板template<typename … Args>实现展开参数并应用函数。

v5.0 递归展开参数包

#include <iostream>

template<typename T>
void processValue(T value) {
    std::cout << value << " ";
}

template<typename T, typename ... Rest>
void processValue(T value, Rest ... rest) {
    processValue(value);
    processValue(rest...);
}

int main() {
    processValue(1, "hello", 3.14);
    // 输出:1 hello 3.14
    return 0;
}
  • 注意使用模板template<typename … Args>实现递归展开参数包。

v6.0 使用可变参数模板作为函数重载

#include <iostream>
#include <string>

template<typename T>
void printValue(T value) {
    std::cout << value << std::endl;
}

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

int main() {
    printValue(1, "hello", 3.14);
    // 输出:
    // 1
    // hello
    // 3.14
    return 0;
}
  • 注意使用模板template<typename … Args>实现使用可变参数模板作为函数重载。

v7.0 模板递归展开参数包

#include <iostream>

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

int main() {
    std::tuple<int, std::string, double> myTuple(42, "hello", 3.14);
    std::apply(printValues<Args...>, myTuple);
    // 输出:42 hello 3.14
    return 0;
}
  • 注意使用模板template<typename … Args>实现使用模板递归展开参数包。

v8.0 使用可变参数模板定义类

#include <iostream>

template<typename ... Args>
class MyClass {
public:
    void printValues(Args ... args) {
        ((std::cout << args << " "), ...);
    }
};

int main() {
    MyClass<int, std::string, double> instance;
    instance.printValues(42, "hello", 3.14);
    // 输出:42 hello 3.14
    return 0;
}
  • 注意使用模板template<typename … Args>实现使用可变参数模板定义类。
更多推荐

C#里面的三种定时计时器:Timer

在.NET中有三种计时器:1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计

什么是Jmeter?Jmeter使用的原理步骤是什么?

1.1什么是JMeterApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java小服务程序、CGI脚本、Java对象、数据库、FTP服务器,等等。JMeter可以用于对

【Linux】分布式版本控制工具git

​​📝个人主页:@Sherry的成长之路🏠学习社区:Sherry的成长之路(个人社区)📖专栏链接:Linux🎯长路漫漫浩浩,万事皆有期待上一篇博客:【Linux】Linux调试器-gdb文章目录一、前言二、版本控制1、何为版本控制2、版本控制工具①集中式版本控制工具②分布式版本控制工具三、代码托管平台四、Lin

【TAPD】实践:TAPD 项目管理配置

目录一、30人以内团队申请免费企业版(1)首次申请试用期3个月(2)进一步申请免费续期二、成员管理三、用户组管理四、项目管理(1)首个项目配置(2)自定义项目模板(3)二次创建项目五、自定义项目模板好处一、30人以内团队申请免费企业版【Tapd】30人以内团队:申请永久免费的Tapd企业版步骤https://gusan

新款 锐科达 SV-2402VP SIP广播音频模块 支持RTP流音频广播

新款锐科达SV-2402VPSIP广播音频模块支持RTP流音频广播SV-2402VP网络音频模块是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。该模块支持多种网络协议和音频编解码协议,可用于VoIP和IP寻呼以及高质量音乐流媒体播放等应用。同时,S

数字孪生在灌区信息中的应用

灌区信息是智慧水利的组成部分,对灌区现代化改造的支撑作用和地位尤为重要,对促进水利可持续发展有重要意义。灌区信息化系统主要对对灌区的水情、雨情、土壤墒情、气象等信息进行监测,对重点区域进行视频监控,同时对泵站、闸门进行远程控制,实现了信息的测量、统计、分析、控制、调度等功能。为灌区管理部门科学决策提供了依据,提升灌区的

TCP并发服务器的多进程实现与多线程实现

TCP并发服务器的多进程实现与多线程实现一、TCP并发服务器的多进程实现代码#include<my_head.h>#defineSERVER_IP"192.168.125.11"//服务器IP#defineSERVER_PORT6666//服务器端口//子进程处理客户端信息函数intdeal_client_messag

小插曲 -- 使用Linux编写 判断程序是否在运行的小程序

编写思路首先,在执行“ps-elf|grepxxx”时,如果xxx存在,通常会有两条结果,一个是xxx对应的PID,一个则是grep对应的PID,但是如果我希望执行命令后,xxx存在就只有xxx对应的PID,不存在就什么都不显示的话,可以将指令修改成:“ps-elf|grepXXX|grep-vgrep”,这样就可以屏

雷电9模拟器抓包

背景本人一开始使用fiddler,然后使用wireshark。然后一直没能成功对雷电9完成JDapp的抓包任务,后来发现一款新产品Reqable,实现了JD请求抓包。思路经过查找资料,我发现核心思路都相差不大,基本使用模拟器wifi代理+证书的形式,把同一局域网下的请求由本地端口代理,再通过工具进行抓包。实战本文以Re

有多条业务线,mysql建多库多表比较好还是一个库多个表比较好呢?

这个问题的答案取决于您的具体需求。以下是一些需要考虑的因素:数据独立性:如果您的业务线之间的数据是独立的,并且不太可能需要进行跨业务线的查询,那么将它们分成多个数据库可能是有意义的。这样可以使每个业务线的数据更加独立,减少潜在的冲突和竞态条件。查询性能:在某些情况下,将数据分为多个表可能会提高查询性能。例如,如果您的数

Qt(day5)

思维导图将登录操作和数据库绑定mywnd.h#ifndefMYWND_H#defineMYWND_H#include<QMainWindow>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QDebug>#include<QMessage

热文推荐