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

35 篇文章 6 订阅
26 篇文章 1 订阅

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

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

                    

#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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值