转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600649.html
需求:Log()函数,能够自动根据时间记录日志信息,要求不定参数类型和参数个数。
第一步,得到日志时间:
get_data() 和get_time()分别得到当前日期和时间。
#include <ctime> static std::string get_data() { time_t t = time(); struct tm *now = localtime(&t); std::stringstream ss; ss<<now->tm_year+<<'_' <<now->tm_mon+<<"_" <<now->tm_mday; return ss.str(); } static std::string get_time() { time_t t = time(); struct tm* now = localtime(&t); std::stringstream ss; ss<<get_data()<<' '; ss<<now->tm_hour<<':' <<now->tm_min<<':' <<now->tm_sec; return ss.str(); }
2.to_string()
C++中,我们使用可变参数模板实现不定参数。
首先实现to_string()参数将Log()中的参数全部传递至streamstring。to_string()通过递归的方式实现。
#include <string> #include <sstream> template <typename T> static int to_string(std::stringstream& ss,const T &t) { ss<<t; ; } template <typename T,typename...Args> static int to_string(std::stringstream& ss,const T &t,const Args&...rest) { ss<<t; return to_string(ss,rest...); }
3.Log()
最后Log()调用上面三个函数,get_data()得到当天的时间找到对应的日志文件,to_string()将日志内容和get_time()时间结合后输入到日志文件中。
template <typename T,typename...Args> static int Log(const T &t,const Args&...rest) { std::stringstream ss; to_string(ss,t,rest...); std::string path = LOG_PATH; path +=get_data(); //日志名字为当天时间 std::fstream log_file; log_file.open(path,std::ios::out|std::ios::app); log_file<<"["<<get_time()<<"]"<<ss.str()<<std::endl; log_file.close(); std::cerr<<ss.str()<<std::endl; }