2014-07-10 62 views
0

我正在C++中爲我的應用程序創建一個記錄器類。該類具有靜態成員以將調試輸出記錄到文件。我想創建一個可以以兩種方式使用宏:爲{零,一個}參數重載預處理器宏

LOG("Log some text") 
      which calls Logger::log(std::string) 

----- -----或

LOG << "Log some text" << std::endl; 
      which calls Logger::getLogStream() 

目的在於包括Logger.h足夠登錄到文件,並使用相同的語法完成,但如果您有其他建議,我並不特別關注宏。不幸的是,使用Boost :: PP不是一種選擇。

我已經lookedaroundsee this comment),但沒有發現任何關於區分LOG和LOG()的調用。我如何區分一個參數和沒有參數?

+0

你不能。預處理器可能是編譯器的一部分,但它不遵循C或C++語言的規則,它是完全不同的語言,具有不同的語法和不同的語義規則。 –

+0

是的,我已經想通了,因爲我搜索,發現沒有辦法。任何其他建議來完成此? Typedefs,內聯,宏或我可能錯過的東西? –

+4

您可以定義一個類似函數的宏LOG(X)和一個名爲LOG的對象。沒有圓括號的'LOG'形式不受函數式宏擴展的影響。也可以定義一個重載'operator()'和'operator <<'的函數對象。 – dyp

回答

3

可以重載Logger類的運營商和避免使用宏

class Logger 
{ 
    public: 

    void operator()(const std::string& ar_text) 
    { 
     log(ar_text); 
    } 

    Logger& operator<<(const std::string& ar_text) 
    { 
     // use logStream here 
     return *this; 
    } 

    Logger& operator<<(std::ostream& (*f)(std::ostream&)) // This is necessary for grabbing std::endl; 
    { 
     // use logStream here 
     return *this; 
    } 
};