C++11可變參數函數模板

在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

相關文章
相關標籤/搜索