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

 template

 void Print(T value)

 {

     std::cout << value << std::endl;

 }

 template

 void Print(Head head, Rail... rail)

 {

     std::cout << head << ", ";

     Print(rail...);

 }

 int main(int argc, _TCHAR* argv[])

 {

     Print();

     Print("hello", );

     Print(, "hello");

     Print(, "hello", 'H');

     getchar();

     return ;

 }

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

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

 void MyPrint(const char * pszText)

 {

     ASSERT(pszText != nullptr);

     std::cout << pszText;

 }

 template

 void MyPrint(const char * pszText, T value, Args... args)

 {

     assert(pszText != nullptr);

     while (*pszText)

     {

         if (*pszText == '%' && *++pszText != '%')

         {

             std::cout << value;

             MyPrint(++pszText, args...);

             return;

         }

         std::cout << *pszText++;

     }

 }

 int _tmain(int argc, _TCHAR* argv[])

 {

     MyPrint(nullptr);

     MyPrint("hello");

     getchar();

     return ;

 }

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

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

  1. 基于express框架的留言板实现步骤

    这个留言板是基于express框架,和ejs模板引擎,首先需要在根目录安装express框架,然后安装ejs模块和body-parser(获取用户表单提交的数据):建立项目目录 message,然后依 ...

  2. 迅为iTOP-4412嵌入式开发板实现中断驱动例程

    本文转自迅为:www.topeetboard.com 大家好,今天我们来学习一下 linux 中断处理驱动的编写,本节我们实现的功能是通过开发板上的按键来控制 led 发光二极管,在之前的章节我们学习 ...

  3. PyQt5多点触控写字板实现及困惑

    Qt支持程序多点触控,就想使用PyQt5做一个触控画板,经过几番周折,查阅了TouchEvent官方文档,又参考了一篇QT for Android的例子,采用eventfilter过滤器来识别触屏事件 ...

  4. ARM开发板实现双系统引导的一种方法——基于迅为iTOP-4412开发板

    前言 本文所用的uboot代码为迅为官方提供,开发板是迅为iTOP-4412开发板.本文如有错误,欢迎指正. 首先,我们确定一下系统启动的流程:首先启动uboot,uboot启动内核并挂载rootfs ...

  5. python-实现输出乘法口诀表

    list1 = [1,2,3,4,5,6,7,8,9] 2 def number(num): 3 for i in list1[:num]: 4 result = 1 * i 5 print(&quo ...

  6. 泛化之美 —— C++11 可变参数模板的妙用

    概述 首先这篇文章出自博客园作者:[qicosmos ],我对本文的实例代码进行了学习.思考和整理纠正,理清了文章的全部细节,觉得这是一篇让我受益匪浅的文章.之所以会接触「可变参数模板」这部分的内容, ...

  7. C++反射机制:可变参数模板实现C++反射(二)

    1. 概要   2018年Bwar发布了<C++反射机制:可变参数模板实现C++反射>,文章非常实用,Bwar也见过好几个看了那篇文章后以同样方法实现反射的项目,也见过不少从我的文章抄过去 ...

  8. 第16课 右值引用(3)_std::forward与完美转发

    1. std::forward原型 template <typename T> T&& forward(typename std::remove_reference< ...

  9. C++模板学习笔记

    一个有趣的东西:实现一个函数print, 输入一个数组, 输出数组的各个维度长度. eg. ], b[][], c[][][]; print(a); //(2, 4) print(b); //(3, ...

随机推荐

  1. python书籍推荐:Python Cookbook第三版中文

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...

  2. shell编程基础语法

    创建文件:touch aaa.sh 把文件变成可执行的命令: chmod +x /Users/dream-mac/Desktop/aaa.sh (这里是文件路径,如果在当前路径下,只需要把文件名写到这 ...

  3. 为什么hexo预览功能总是间歇性失效?

    个人主题:yilia 有的文章可以正常截断,有的文章不行. 开始我以为这是hexo的一个小bug,但是后来通过查阅GitHub和知乎等网站发现这完全是由于我自己的粗心造成的…手动滑稽 hexo pag ...

  4. Mysql学习笔记03

    Mysql 的视图 1  view  在查询中,我们经常把查询结果当成临时表来看, view 是什么? View 可以看成一张虚拟的表,是表通过某种运算得到的有一个投影. 2 如何创建视图? 创建视图 ...

  5. 2013年省赛H题

    2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...

  6. python3 实现对代码文件中注释的翻译

    心血来潮,昨天看见群里讨论一段图片转pdf的代码,直接拿过来发现不能用,原来是因为代码中传的文件对象不对,源码中说传递的是一个文件路径或一个文件对象.他传的是一个文件名,很是尴尬. 想了想,主要原因还 ...

  7. Android SQLite数据库升级,怎么做(事物更改)

    SQLiteOpenHelper // 如果数据库文件不存在,只有onCreate()被调用(该方法在创建数据库时被调用一次) public abstract void onCreate(SQLite ...

  8. android studio gradle 打jar 包 (混淆+第三方库包)

    将依赖的第三方库打包进自己的jar包 1.先将第三方的库包拿到,然后添加jar包到项目的libs. 2.项目的build.gradle脚本添加下面的task: task buildJar(depend ...

  9. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习9

    #include <iostream> #include <fstream> #include <cstdlib> #include <string> ...

  10. 分享几个有意思的css js工具网站

    一.VOCABS(css html术语) vocabs 适合初学者快速认知各个代码的术语. 二.OverAPI(语言参考手册,几乎包含所有语言) OverAPI 适合快速查阅相关语言api 三.Jav ...