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

C++11 tuple&可变参数模板

 1 template
 2
 3 void Print(T value)
 4
 5 {
 6
 7     std::cout << value << std::endl;
 8
 9 }
10
11 template
12
13 void Print(Head head, Rail... rail)
14
15 {
16
17     std::cout << head << ", ";
18
19     Print(rail...);
20
21 }
22
23 int main(int argc, _TCHAR* argv[])
24
25 {
26
27     Print(1);
28
29     Print("hello", 1);
30
31     Print(1, "hello");
32
33     Print(1, "hello", ‘H‘);
34
35     getchar();
36
37     return 0;
38
39 }

在上面的代码中,我们先定义了一个只有一个模板参数的函数模板,它简单地输出传入的参数的值。然后又定义了一个可变参数的函数模板,它输出第一个参数的 值,然后递归地调用自己。注意rail...这种写法,它表示将函数参数包分割成一个一个的参数,并传入Print中。这样,函数参数包中的第一个参数传 递给head,剩余的参数又重新构成一个函数参数包传递给rail。当递归调用到函数参数包中只有一个参数时,则会调用只有一个模板参数的Print函 数。

理解了可变模板参数的使用原理后,我们再来编写一个自己的Printf函数。

 1 void MyPrint(const char * pszText)
 2
 3 {
 4
 5     ASSERT(pszText != nullptr);
 6
 7     std::cout << pszText;
 8
 9 }
10
11 template
12
13 void MyPrint(const char * pszText, T value, Args... args)
14
15 {
16
17     assert(pszText != nullptr);
18
19     while (*pszText)
20
21     {
22
23         if (*pszText == ‘%‘ && *++pszText != ‘%‘)
24
25         {
26
27             std::cout << value;
28
29             MyPrint(++pszText, args...);
30
31             return;
32
33         }
34
35         std::cout << *pszText++;
36
37     }
38
39 }
40
41 int _tmain(int argc, _TCHAR* argv[])
42
43 {
44
45     MyPrint(nullptr);
46
47     MyPrint("hello");
48
49     getchar();
50
51     return 0;
52
53 }

上述代码实现的功能针对可变参数模板的应用,当然不会像printf函数那么健壮,MyPrint识别格式化参数的标志就是%+下一位字符,如果条件满足的话就从Args参数中获取参数包分割后的第一个参数

时间: 2024-10-10 12:19:09

C++可变参数模板实现输出的相关文章

CC2540 CC2541 蓝牙4.0BLE开发板实现 空中飞鼠、体感游戏手柄【多图】

蓝牙4.0BLE开发板实现空中飞鼠.体感游戏手柄 近年来开始流行空中飞鼠与体感游戏手柄,正好我们的开发板上设计有插入mpu6050六轴传感器的适配接口,我们中秋节期间兴趣使然,实现了这么一个方案. 感谢 "圆点博士STM32" 提供的mpu6050 dmp输出欧拉角度的例程,没有他们预先移植到stm32上,我们也没那么快在我们这个开发板上能跑上mpu605的dmp输出. 感谢Micorduino的小潘, 给我提了不少好建议,他们在做Arduino的兼容产品,效果优秀. 硬件需求: 1,

笔记本触摸板实现鼠标滚轮功能---Synpatics 定点装置

Synpatics定点装置,它是笔记本触摸板的驱动,把它稍微设置一下就基本可以用触摸板代替鼠标,以下是网上的介绍: Synaptics获2014消费电子展"创新设计与工程奖" 11月25日消息,人机界面解决方案的领先开发商Synaptics公司(纳斯达克代码:SYNA)今天宣布,凭借ClickPad 2.0技术,公司已被提名为2014年度国际消费电子展“创新设计与工程奖”获得者.Synaptics ClickPad 2.0是当今市场上最先进的电容式传感笔记本电脑触摸板技术,集成了一种特

Swift开发之UIButton作为蒙板实现图片缩放

很多伙伴们们总是认为缩放图片的时候很是麻烦,因为不知道从哪里下手,特别是面对新的开发语言,其实图片缩放有很多种方法,但是万变不离其宗,那就是frame,所以,不要想的那么高大上.下面是一个利用蒙板实现的图片缩放demo,感兴趣的伙伴们可以看一下. // //  ViewController.swift //  图片的缩放 // //  Created by 悦兑科技 on 15/1/15. //  Copyright (c) 2015年 BSY. All rights reserved. //

剪切板实现拖拽代码

// //  PJXDragAndDropView.m //  PJXPasteboard // //  Created by 王俏 on 16/8/29. //  Copyright © 2016年 wangqiao. All rights reserved. // #import "PJXDragAndDropView.h" NSString *kPrivateDragUTI = @"com.yourcompany.cocoadraganddrop"; @imp

涂鸦板实现思路和步骤

------------- 基本思路 -------------- 1. 搭建界面 2. 实现画线功能 2.1 实现画单笔 2.2 实现画多笔 2.3 实现设置线宽 2.4 实现设置线条颜色 3. 实现清屏 4. 实现回退 5. 实现橡皮擦 6. 实现保存到相册功能 7. 实现插入照片功能 ------------- 基本思路 -------------- 1. 使用自动布局搭界面 - 顶部的 UIToolBar - 底部的自定义 View - 中间的绘图用的 View 2. 实现基本的绘图功能

第21课 可变参数模板(2)_展开参数包

1. 可变参数模板函数 (1)递归函数方式展开参数包 ①一般需要提供前向声明.一个参数包的展开函数和一个递归终止函数. ②前向声明有时可省略,递归终止函数可以是0个或n个参数 (2)逗号表达式和初始化列表方式展开参数包 ①逗号表达式按顺序执行,返回最后一个表达式的值. ②initilizer_list可接受任意多个不同类型的参数. ③借助逗号表达式来展开包,并将返回的结果用于初始化initilizer_list. [编程实验]展开可变参数模板函数的参数包 #include <iostream>

使用嵌入式开发板实现对车位锁控制的流程及程序实现

随着城市化进程的加快,新能源汽车呼之欲出.在笔者所在的城市,力帆和长安等公司都先后推出了可供市民租用的电动汽车.在享受租车所带来的便利的同时,汽车的充电就成了一个难题,在城市道路和停车场安装充电桩成为解决这个问题的一个有效的手段.汽车充电时,需要有一个可用于停靠的车位,并且这个车位只能在汽车充电的时候使用,在其他时间都不能被占用.也就是说,每个充电的车位需要有一个车位锁,当有汽车充电的时候,车位锁打开,否则车位锁关闭. 本文用嵌入式开发板实现了对车位锁开关的控制,可供相关项目的开发人员参考. 一

A股最新的自由现金流和折现估值查询

A股最新的自由现金流折现估值,利用自由现金流折现的经典公式,采用 8%.9%.10%.11%.12%.15% 等贴现率来进行估值. SH600000:浦发银行的最新自由现金流和折现估值模型: 浦发银行 SH600004:白云机场的最新自由现金流和折现估值模型: 白云机场 SH600005:武钢股份的最新自由现金流和折现估值模型: 武钢股份 SH600006:东风汽车的最新自由现金流和折现估值模型: 东风汽车 SH600007:中国国贸的最新自由现金流和折现估值模型: 中国国贸 SH600008:

信息安全系统设计基础实验五:通讯协议设计

北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:52.53 姓名:王思亓 赵阳林 学号:20135205 20135334 成绩: 指导教师:娄嘉鹏 实验日期:2015.11.24 实验密级: 预习程度: 实验时间:15:30—18:00 仪器组次: 必修/选修:必修 实验序号: 实验名称:通讯协议设计 实验目的与要求:1.掌握在ARM开发板实现一个简单的WEB服务器的过程.2.学习在ARM开发板上的SOCKET网络编程.3.学习Linux下的signal()函