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

    xiaoxiao2021-04-01  35

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

      4162人阅读  评论(0)  收藏  举报   分类: C++模板(25)   C/C++(84) 

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

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

                        

    [cpp]  view plain  copy  print ? #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

    转载请注明原文地址: https://ju.6miu.com/read-665621.html

    最新回复(0)