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

相关文章
相关标签/搜索