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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hbase解决海量图片存储

    hbase解决海量图片存储随着互联网、云计算及大数据等信息技术的发展,越来越多的应用依赖于对海量数据的存储和处理,如智能监控、电子商务、地理信息等,这些应用都需要对海量图片的存储和检索。由于图片大多是小文件(80%大小在数MB以内),以GFS、HDFS为代表的适用于流式访问大文件的分布式存储系统,若直接用来存储图片,由于元数据膨胀,在扩展性和性能方面均存在严重问题。   为了解决HDFS在小文件存储方面的问题,通

    2022年7月12日
    20
  • Java到底好不好学「建议收藏」

    Java到底好不好学「建议收藏」Java到底好不好学答案是:不难学。很多人都以为编程是个很高深的东西,其实不然,真正学习了你会发现编程比你高中学的数理化要简单的多。说它不难呢,如果学深入了,还算有很多东西要学习,比如你学Java,后面可能要了解计算机组成原理、操作系统等底层知识,当然这些知识只要用心去了解,还是我们一般人都可以理解的。Java学习途径说到一门知识或技能好不好用,学习途径是很重要的,如果没有学习途径,有的时候一个很简单的知识都要花很久搞明白。我们是踩在巨人的肩上的,老一辈人给我留下了很多宝贵知识以及经验,..

    2022年7月7日
    20
  • 三极管饱和的判断「建议收藏」

    三极管饱和的判断「建议收藏」三极管是电流放大器件,决定三极管是否饱和取决于Ib和Ic的相对大小,通常来讲Ic/Ib>hfe时,三极管饱和。因此导出以下结论:1.如何判断饱和?判断饱和时应该求出基级最大饱和电流IBS,然后再根据实际的电路求出当前的基级电流,如果当前的基级电流大于基级最大饱和电流,则可判断电路此时处于饱和状态。2.饱和的条件:1.集电极和

    2022年9月11日
    0
  • SAP QAS数据增长空间太快

    SAP QAS数据增长空间太快背景:我们是在一台数据库上删除另外的一台数据库上的大量数据,运用的crontab+linuxshell+rman,然后生产了大量的日志。解决方法清除以下的日志deletearchivelog.sh脚本exportORACLE_SID=QASexportORACLE_BASE=/oracleexportORACLE_HOME=/oracle/QAS/112_64/oracle/QAS/112_64/bin/rmantarget/<<EOFrun{cro

    2022年6月28日
    18
  • 职业目标的评估与调整_遥感图像目标检测数据集

    职业目标的评估与调整_遥感图像目标检测数据集COCO系列文章:MSCOCO数据集目标检测评估(DetectionEvaluation)(来自官网)MSCOCO数据集人体关键点评估(KeypointEvaluation)(来自官网)MSCOCO数据集输出数据的结果格式(resultformat)和如何参加比赛(participate)(来自官网)MSCOCO官网数据集(百度云)下载,COCOAPI、MASKA……

    2022年10月16日
    0
  • 系统错误号:0x8007005[通俗易懂]

    系统错误号:0x8007005通常这个错误代码是错误的权限导致的,所以只要改变系统的安全设置就行了。下载这个文件SubInACL(SubInACL.exe)http://www.microsoft.com/downloads/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en安装这

    2022年4月7日
    283

发表回复

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

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