使用仿函实现函数参数的部分自动填充

    技术2024-07-18  58

    使用仿函实现函数参数的部分自动填充

    编译器提供了很多和代码上下文相关的宏。例如:__FILE__表示当前代码所在的文件,__LINE__代表当前代码所在行号。你也许希望在日志记录时自动填充这些信息,避免每次都写。用常规的函数调用或者宏,都无法做到这一点,而仿函则可以很好的完成这个任务。

     

    所谓仿函,就是定义了()的类对象。由于是一个对象,仿函可以记录一些信息,我们可以利用这个信息来实现参数的自动填充。下面我们就用一个日志类来实现在输出日志时,自动填充日志记录的位置。

     

    首先,我们要定义一个日志类,这个日志类能输出文本到日志中。下面的例子把日志文件输出到文件c:/log.txt或者你指定的文件中:

     

     // Logger.h: interface for the CLogger class. // // #if !defined(AFX_LOGGER_H__29464E1D_BD17_4107_B398_157DF085764E__INCLUDED_) #define AFX_LOGGER_H__29464E1D_BD17_4107_B398_157DF085764E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <iostream> #include <fstream> using namespace std; class CLogger { ofstream _out; public: CLogger(); CLogger(const string & filename_); virtual ~CLogger(); }; #endif // !defined(AFX_LOGGER_H__29464E1D_BD17_4107_B398_157DF085764E__INCLUDED_)  

     

     

    // Logger.cpp: implementation of the CLogger class. // // #include "stdafx.h" #include "Logger.h" // // Construction/Destruction // CLogger::CLogger() { _out.open("c://log.txt"); } CLogger::CLogger(const string& filename_) { _out.open(filename_.c_str ()); } CLogger::~CLogger() { }

     

    我们给CLogger类增加两个public成员变量_line(unsigned int)和_file(string)分别表示当前日志的文件行和文件名,并重载()实现输出

     

    void CLogger::operator () (const char * format_, ...) { _out << "File name:"<<_file.c_str () << endl<< "Line number:"<<_line <<endl; va_list ap; va_start(ap,format_); _out << ap <<endl; }

     

    我们使用static函数instance实现单件模式:

     

     CLogger& CLogger::instance(const char *file, unsigned int line) { static CLogger logger; logger._file = file; logger._line = line; return logger; }

     

    最后我们可以用下面宏实现自动填充:

    #define MYLOG CLogger::instance(__FILE__, __LINE__)

     

    而你输出日志的格式将是:

    MYLOG("Log int:%d", iValue);

    MYLOG("Log double:%f",fValue);

    最新回复(0)