C++ 可变参数模板、折叠表达式、泛型 Lambda 与引用折叠

1. 可变参数模板

可变参数模板是 C++11 引入的,允许模板接受任意数量的模板参数,使用参数包来表示n(n>=0)个模板参数。

cpp 复制代码
模板声明    template<typename... Args>
参数包展开   Args... args
求参数的个数  sizeof...
1.1基本可变参数模板加左折叠
cpp 复制代码
template <typename... Args>
void print_fold(Args... args)
{
    ((std::cout << args << " "), ...);
    std::cout << std::endl;
}
main--->    printAll(1, 2.5, "hello", 'a'); 
1.2递归展开
cpp 复制代码
// 递归展开
template<typename T, typename... Args>
void print(T first, Args... args) {
    std::cout << first << " ";
    print(args...);  // 递归调用
}
// 终止递归的函数
void print() {
    std::cout << "结束递归" << std::endl;
}
main--->    print(1, 2.5, "hello", 'aaa');     // 递归展开

其中 args...表示递归处理除第一个参数外的剩余参数。

内存布局

复制代码
参数包在内存中的表示:
+----------+----------+------------+----------+
|   int    |  double  | const char*|   char   |
|    1     |   2.5    |   "hello"  |  'aaa'   |
+----------+----------+------------+----------+
    ↓          ↓            ↓          ↓
  Args[0]    Args[1]     Args[2]     Args[3]

2. 折叠表达式 (C++17)

口诀: "有&就是 &,全 && 才是 &&

左/右折叠:

cpp 复制代码
template <typename... Args>
void print_fold(Args... args){	
    (...,(std::cout << args << " "));//左
    ((std::cout << args << " "), ...);//右
}

对逗号操作符来说,左/右折叠的求值顺序是一样的 ,所以无论用 (..., 表达式) 还是 (表达式, ...),输出顺序都正确。


3. 泛型 Lambda (C++14)

lambda 本身不能直接是模板(C++20 之前。允许在 Lambda 表达式中使用 auto 作为参数类型,使得 Lambda 成为模板函数对象。

复制代码
[capture-list] (parameters) -> return-type { body }
      ↑               ↑            ↑          ↑
   捕获列表      参数列表(必须)  返回类型    函数体
cpp 复制代码
//basic
auto func=[](int a,int b)->int{
	return a+b;
}
//C++14
auto print_fold_lambda = [](auto &&...args) -> void
{
    ((std::cout << args << " "), ...);
    std::cout << std::endl;
};

一个小样例:获取用户输入的一串数据,中的整形数据。stoi()会过滤非string类型数据。

相关推荐
dr_yingli3 分钟前
fMRI(3-1)报告(个体化报告)生成器说明
开发语言·matlab
hrhcode3 分钟前
【java工程师快速上手go】一.Go语言基础
java·开发语言·golang
yashuk5 分钟前
C语言 vs. C++ ,哪个更适合初学者?
c语言·c++·面向对象编程·初学者·学习路径
-许平安-12 分钟前
MCP项目笔记十(客户端 MCPClient)
c++·笔记·ai·raii·mcp·pluginapi·plugin system
一只旭宝15 分钟前
【C++ 入门精讲2】函数重载、默认参数、函数指针、volatile | 手写笔记(附完整代码)
c++·笔记
飞Link26 分钟前
【AI大模型实战】万字长文肝透大语言模型(LLM):从底层原理解析到企业级Python项目落地
开发语言·人工智能·python·语言模型·自然语言处理
妙蛙种子31127 分钟前
【Java设计模式 | 创建者模式】 原型模式
java·开发语言·后端·设计模式·原型模式
LlNingyu33 分钟前
Go 实现无锁环形队列:面向多生产者多消费者的高性能 MPMC 设计
开发语言·golang·队列·mpmc·数据通道
旖-旎33 分钟前
哈希表(存在重复元素||)(4)
数据结构·c++·算法·leetcode·哈希算法·散列表
Lyyaoo.34 分钟前
【JAVA基础面经】线程的状态
java·开发语言