在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