C++11:可变参数模板实现print输出参数

本文介绍C++11中可变参数模板的使用方法,通过一个递归调用的print函数实例,展示了如何将任意数量及类型的参数输出到标准输出流中。

C++11支持可变参数模板的特性,真的是很好用。
下面代码实现的print函数,就利用可变参数模板以及函数模板递归调用,实现将任意多个不同类型的参数顺序输出打印到std::ostream流中。

#include <iostream>
/* 终止递归函数 */
inline void args_print(std::ostream& steam){}
/* 使用可变参数模板实现参数打印到输出流(ostream) (递归调用) */
template<typename T,typename ...Args>
inline void args_print(ostream& std::steam,T first,Args...rest){
	steam<< first;
	args_print(steam,rest...);//剩余参数递归调用
}
### 3.1 可变参数模板的基本语法 C++11 引入了可变参数模板(Variadic Templates),允许定义接受不定数量和类型参数模板[^2]。其基本语法如下: ```cpp template <typename... Args> void func(Args... args) { // 函数体 } ``` 其中,`Args...` 是一个模板参数包(template parameter pack),表示可以接受任意数量的类型参数;`args` 是函数参数包(function parameter pack),表示函数可以接受任意数量和类型的实参。 ### 3.2 参数包的展开方式 可变参数模板的核心在于参数包的展开(parameter pack expansion)。通过递归展开或折叠表达式(fold expressions,C++17 起)等方式,可以在编译期处理参数包中的每个参数。 #### 3.2.1 递归展开 最常见的展开方式是使用递归模板实例化,依次处理每个参数: ```cpp // 基例:无参数 void print() { std::cout << std::endl; } // 递归展开 template <typename T, typename... Args> void print(T first, Args... rest) { std::cout << first << " "; print(rest...); } // 使用示例 print(1, 2.0, "hello"); // 输出: 1 2 hello ``` #### 3.2.2 折叠表达式(C++17) C++17 引入了折叠表达式,可以更简洁地处理参数包中的操作: ```cpp template <typename... Args> auto sum(Args... args) { return (args + ...); // 右折叠 } // 使用示例 int result = sum(1, 2, 3, 4); // result = 10 ``` ### 3.3 可变参数模板的实际应用场景 可变参数模板广泛用于现代 C++ 编程中,特别是在标准库和元编程中。以下是几个典型应用场景: #### 3.3.1 构造函数和 `emplace` 接口 STL 容器如 `std::vector` 和 `std::map` 提供了 `emplace` 系列函数,利用可变参数模板直接在容器内部构造对象,避免不必要的拷贝或移动操作: ```cpp std::vector<std::string> vec; vec.emplace_back("Hello"); // 直接构造 std::string("Hello") ``` #### 3.3.2 函数对象封装(如 `std::function` 和 `std::bind`) `std::function` 和 `std::bind` 利用可变参数模板实现对任意可调用对象的封装,支持不同参数数量和类型的调用: ```cpp std::function<int(int, int)> f = [](int a, int b) { return a + b; }; int result = f(3, 4); // result = 7 ``` #### 3.3.3 编译期类型列表和元编程 可变参数模板常用于模板元编程中,构建类型列表、实现编译期反射、类型检查等: ```cpp template <typename... Types> struct TypeList {}; TypeList<int, double, std::string> list; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值