在Log時參數是類型和個數是不固定的,因此在作log函數時,不少煩惱,不過C++11給咱們帶來的但願
ios
這個是今天剛讀到的,加上本身的理解爲字節寫了一個logger類,也給你們瞧瞧啊,歡迎大蝦拍板轉c++
#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++11spa