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

 

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

  4162人阅读  评论(0)  收藏  举报
  分类:
 

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

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

                    

[cpp]  view plain  copy
 print ?
  1. #include <fstream>  
  2. #include <iostream>  
  3. using namespace std;  
  4. class Logger {  
  5. public:  
  6.     /** 
  7.      * @brief _out_os log输出的地方,默认是std::cout,给赋值时最好是全局变量 
  8.      */  
  9.     static ostream * _out_os;  
  10.     /** 
  11.      * @brief _logger_is_on 开关 
  12.      */  
  13.     static bool _logger_is_on;  
  14.   
  15.     static void makeLoggerOn() {  
  16.         _logger_is_on = true;  
  17.     }  
  18.   
  19.     static void makeLoggerOff() {  
  20.         _logger_is_on = false;  
  21.     }  
  22.   
  23.     static bool loggerState() {  
  24.         return _logger_is_on;  
  25.     }  
  26.   
  27.     template<typename... Aargs>  
  28.     static void log(const Aargs&... args) {//这边使用了C++11的可变参数函数模板的特性,说白了,还是递归调用  
  29.         if (_logger_is_on) {  
  30.             //此处编译器会判断参数的个数,如果是一个则调用logHelper(ostream& os, const T& t1)  
  31.             //否则这是下面的logHelper(ostream& os, const T& t1, const Tn&... args),其自身递归调用,直到只有一个参数,从  
  32.             //logHelper(ostream& os, const T& t1)作为出口出来  
  33.             logHelper(*_out_os,args...);  
  34.             *_out_os << endl;  
  35.         }  
  36.   
  37.     }  
  38. protected:  
  39.     template<typename T>  
  40.     static void logHelper(ostream& os, const T& t1) {  
  41.         os << t1;  
  42.     }  
  43.     template<typename T, typename... Tn>  
  44.     static void logHelper(ostream& os, const T& t1, const Tn&... args) {  
  45.         os << t1 << ' ';  
  46.         logHelper(os,args...);  
  47.     }  
  48. };  
  49. ostream * Logger::_out_os = & std::cout;  
  50.   
  51. bool Logger::_logger_is_on = false;  
  52.   
  53. //__func__ 当前的函数名  
  54. //__VA_ARGS__,可变参宏  
  55. #define log(...) Logger::log(__FILE__,' ',__LINE__,' ',__func__,"():",__VA_ARGS__)  



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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值