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


相关推荐

  • matlab中coef是什么,LinearRegression()中的coef_U值代表什么?

    matlab中coef是什么,LinearRegression()中的coef_U值代表什么?我是机器学习的初学者。这只是一个简单的问题,LinearRegression()中的coef帴代表什么?我知道它代表的是系数,但我不明白这些值,高的和正的系数意味着更强的关系吗?在而且,如果coef_u值是指数型的,这是否意味着我的线性回归是错误的?在array([-3.12840684e+02,-1.01279891e+13,-1.42682874e+13,-1.42682874e+13,…

    2025年7月12日
    2
  • MySQL行转列实现和总结

    MySQL行转列实现和总结一、行转列实例1、准备数据CREATETABLEtb(`cname`VARCHAR(10),courceVARCHAR(10),scoreINT)ENGINE=INNODB;INSERTINTOtbVALUES(‘张三’,’语文’,74);INSERTINTOtbVALUES(‘张三’,’数学’,83);INSERTINTOtbVALUES(‘张三’,’物理…

    2022年6月12日
    29
  • 正交矩阵的模_正交矩阵的向量组

    正交矩阵的模_正交矩阵的向量组本节主要讲解正交(orthogonal)概念对于向量、基和子空间的意义。1.正交向量Orthogonalvectors2.正交子空间Orthogonalsubspaces3.零空间与行空间正交Nullspaceisperpendiculartorowspace4.矩阵A^TA

    2025年8月23日
    2
  • cuid卡0区被锁_复制门禁卡uid写入失败

    cuid卡0区被锁_复制门禁卡uid写入失败CUID卡是一款支持UID号重复擦写使用的UID卡,无限次修改0扇区!完美替代普通防屏蔽卡(FUID,UFUID)。无需锁卡自动起防屏蔽作用,可重复擦写使用无废卡,不会像FUID或UFUID锁死后才起到防屏蔽作用,更不会因为锁卡而变成一次性卡,无法更改卡内数据成为废卡。CUID防屏蔽卡专门对付物业升级的防复卡和防复读头,是物业升级后UID卡不能使用的克星,CUID卡无论从功能上和价格都优胜FUID…

    2025年7月18日
    4
  • 每个程序员都曾犯过的10大经典错误!

       作者 | Daan 策划 | 万佳 在程序员的职业生涯中,你都犯过哪些经典错误? 人非圣贤,孰能无过。对于犯错,你不用太困扰,因为对开发者而言,犯错太正常…

    2021年6月22日
    122
  • 能否利用Hadoop搭建完整的云计算平台「建议收藏」

    Hadoop并不完全代表云计算,所以,要用Hadoop搭建完整的云计算平台,答案是不够。我们常说云计算,实际上还是通过计算机的大规模或者说海量处理来为生活中各式各样的人和各行各业服务——所以,核心在“服务”。关于服务,展开来就是常用的那3种(也是事实上的标准):SaaS,PaaS,IaaS。对云计算来说,公有和私有,虚拟和存储,这其实是相对讨论的核心。回头说Hadoop。在Google三大…

    2022年4月7日
    43

发表回复

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

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