在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