C++11可变参数函数模板

C++11可变参数函数模板

在Log时参数是类型和个数是不固定的,所以在做log函数时,很多烦恼,不过C++11给我们带来的希望羡慕

这个是今天刚读到的,加上自己的理解为字节写了一个logger类,也给大家瞧瞧啊,欢迎大虾拍板转

                    

#include <fstream> #include <iostream> using namespace std; class Logger { public: /** * @brief _out_os log输出的地方,默认是std::cout,给赋值时最好是全局变量 */ static ostream * _out_os; /** * @brief _logger_is_on 开关 */ static bool _logger_is_on; static void makeLoggerOn() { _logger_is_on = true; } static void makeLoggerOff() { _logger_is_on = false; } static bool loggerState() { return _logger_is_on; } template<typename... Aargs> static void log(const Aargs&... args) {//这边使用了C++11的可变参数函数模板的特性,说白了,还是递归调用 if (_logger_is_on) { //此处编译器会判断参数的个数,如果是一个则调用logHelper(ostream& os, const T& t1) //否则这是下面的logHelper(ostream& os, const T& t1, const Tn&... args),其自身递归调用,直到只有一个参数,从 //logHelper(ostream& os, const T& t1)作为出口出来 logHelper(*_out_os,args...); *_out_os << endl; } } protected: template<typename T> static void logHelper(ostream& os, const T& t1) { os << t1; } template<typename T, typename... Tn> static void logHelper(ostream& os, const T& t1, const Tn&... args) { os << t1 << ' '; logHelper(os,args...); } }; ostream * Logger::_out_os = & std::cout; bool Logger::_logger_is_on = false; //__func__ 当前的函数名 //__VA_ARGS__,可变参宏 #define log(...) Logger::log(__FILE__,' ',__LINE__,' ',__func__,"():",__VA_ARGS__)

无图无真相,还是来张图吧

另外就是,我用的是g++ 4.7 编译的时候加上-std=c++11

C++11可变参数函数模板

转载于:https://my.oschina.net/u/854744/blog/418207

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109445.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • windows10虚拟机安装_虚拟机一键安装版

    windows10虚拟机安装_虚拟机一键安装版[XP虚拟机安装]VMware安装XP虚拟机下载VMware下载XPProfessional,我是在这个网站下的http://www.runker.net/windows-xp-sp3.html新建虚拟机,选择典型选择刚刚下载的XP镜像文件(这里用简易安装更方便,如果不用简易安装还需要进BIOS设置CD启动项啥的,安装过程也需要自己一步步操作,麻烦一些)点击下一步,要求填写秘钥,百度搜索秘钥填进去可以参考https://zhidao.baidu.com/question/45439092

    2022年8月16日
    5
  • SWD接口_swd调试接口定义

    SWD接口_swd调试接口定义SWD接口:我们比较常用的是Jlink下载器,这种下载器有一个缺点就是使用的Jtag20PIN接口,太多的PIN会导致一些小型的PCB板很拥挤,也会增加布线的难度。而使用SWD接口下载调试,只

    2022年8月4日
    4
  • Centos小技巧

    Centos小技巧

    2021年6月3日
    127
  • Excel快捷键壁纸_桌面壁纸 霸气

    Excel快捷键壁纸_桌面壁纸 霸气PS快捷键桌面壁纸由于上传文件大小的限制,需要高清原图,请私聊……

    2022年9月29日
    3
  • C语言中数组的总结

    C语言中数组的总结目录一维数组的创建和初始化一维数组的使用一维数组在内存中的存储指针的初步介绍一维数组的指针访问二维数组的创建和初始化二维数组的使用二维数组在内存中的存储二维数组的指针访问有关数组的运算数组作为函数参数1.一维数组的创建和初始化数组的创建:在创建数组时,我们必须定义数组的类型和大小,数组的大小不能为0,数组中的元素类型都是相同的。eg:intarr[

    2022年5月2日
    50
  • python垃圾回收机制原理

    python垃圾回收机制原理#python垃圾回收机制详解一、概述:  python的GC模块主要运用了“引用计数(referencecounting)”来跟踪和回收垃圾。在引用计数的基础上,还可以通过标记清除(markandsweep)解决容器(这里的容器值指的不是docker,而是数组,字典,元组这样的对象)对象可能产生的循环引用的问题。通过“分代回收(generationcollection)”以空间换取时间来进一步提高垃圾回收的效率。二、垃圾回收三种机制  1、引用计数  在Python中,大多数对象的生命周

    2022年6月24日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号