C++可变参数模板(展开参数包)

C++版本 C11 - C14

例子:

cpp 复制代码
#include "X:\Work\Share\CCode\CPlatform\Base\global_c_all.h" 

using namespace lf;
using namespace std;
 
 

//递归终止函数
void Print()
{
	_cout << _t("\n");
}

template <typename T, typename ...Args>
void Print(T first, Args... args)
{
	_cout << first;
	Print(args...);
}

void main()
{
	 	 
	int pi = 3.14;
	 
	Print("pi=", pi,"\t_Math::_e=", _Math::_e);

	Print("a=", 10, _t("\tb="), 3.14,_t("\t水果:"), lf::水果("苹果",200,"圆形"));

}
 

输出:

其中

两个函数名称必须一样:

如果想获取参数个数,可用sizeof...(args)

例如:

输出:

因为是递归调用,所以输出格式乱了,下

面是输出参数类型列表:

cpp 复制代码
#include "X:\Work\Share\CCode\CPlatform\Base\global_c_all.h" 

using namespace lf;
using namespace std;
 
 

//递归终止函数
void Print()
{
	_cout << _t("\n");
}

template <typename T, typename ...Args>
void Print(T first, Args... args)
{
	std::cout << typeid(first).name() << "\n";	 

	Print(args...);
}

void main()
{
	 	 
	int pi = 3.14;
	 
	Print("pi=", pi,"\t_Math::_e=", _Math::_e);	 

}
 

结果:

C++版本17或以上例子可用:

cpp 复制代码
#include <iostream>
using namespace std;

// 定义一个函数模板,接收任意类型的参数包并打印每个参数值
template<typename T>
void printArgs(T arg) {
    cout << "Arg value: " << arg << endl;
}

// 递归地展开参数包
template<typename... Args>
void expandPack(Args&&... args) {
    // 将args作为单个参数传入printArgs函数进行处理
    (printArgs(forward<Args>(args)), ...);
}

int main() {
    int a = 10;
    double b = 3.14;
    string c = "Hello";

    // 调用expandPack函数展开参数包
    expandPack(a, b, c);

    return 0;
}

输出:

相关推荐
我不是懒洋洋5 分钟前
从零实现一个分布式计算:MapReduce的核心设计
c++
微学AI8 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡9 小时前
算法日记 - Day3
java·开发语言·算法
韭菜炒鸡肝天10 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
小王C语言10 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
Aaron - Wistron10 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy123931021611 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
05664612 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄12 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰12 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#