2009-08-18 2 views
0

내 (단순한) log class에 스트림을 사용할 수 있도록 기능을 추가하려고합니다. 현재, 일부 수정 후, 나는 (내 cpp에있는)이있어 : 난 당신이 이미 가지고있는 m_log가 유효한 포인터 (결과를 확인하기 위해이 코드를 사용하고C++ 문자열 스트림의 끝을 얻는 방법?

내 "클라이언트"응용 프로그램에서 이제
// blah blah blah... 
// note: here String is a defined as: typedef std::string String; 

void Log::logMessage(const String& message) 
    { 
     logText(); // to be sure we flush the current text if any (when "composing" a message) 
     addText(message); 
     logText(); // really log the message and make the current text empty 
    } 

// blah blah blah... 

    Log& operator<<(Log& log, const std::stringstream& message) 
    { 
     log.logMessage(message.str()); 
     return log; 
    } 

    Log& operator<<(Log& log, const String& message) 
    { 
     log.addText(message); 
     return log; 
    } 

) 추측 :

gcore::Log& log = *m_log; 
log << getName() << " : application created."; 
log << "This is a test for " << getName(); 

지금 내가 가진 문제는이 테스트 코드는 문자열로 < < 연산자를 호출하기 때문에 logText() (와 logMessage)가 호출되지 것입니다.

log << getName() << " : application created."; 

내가이 또는 작업을 수행하는 방법을 잘 모르겠어요

log.addText(getName()); 
log.addText(" : application create."); 
log.logText(); 

에 해당 될 것이다 : 내가 필요한 것은 문자열의 주어진 증기가 완료 logText()를 호출하는 방법입니다 그것이 가능하다면. 내 첫번째 추측은이 같은 스트림의 끝에 표준 : ENDL를 사용할 수있을 것입니다 :

log << getName() << " : application created." << std::endl; 

또는 이에 해당하지만, 그 스트림에 객체를 추가하지 않고 그것을 할 수 있는지 좋은 것.

아이디어가 있으십니까?

+0

왜 로그 헤더

: 내 경우에는이 솔루션의 (작업 및 효과) 구현 logText()가 호출 될 때까지 지연하여 실제로 메시지를 기록합니까? – Ozan

+0

예, addText()는 std :: stringstream을 채우지 만 logText()는 스트림의 문자열 결과를 "기록"하기 위해 일부 작업을 수행합니다. logText()는 문자열 값을 파일 및 표준 스트림에 기록하고 시간 정보를 추가하므로 "log"는 logText()가 호출 된 후에 만 ​​수행되어야합니다. 텍스트가 비어 있으면 호출이 무시됩니다. – Klaim

답변

3

당신은 임시 객체를 생성하고 문장의 끝을 잡기 위해 자신의 소멸자를 사용할 수 있습니다

는 다음과 같은 코드가이

처럼 사용되는 기본적인 아이디어

class Log 
{ 
public: 
    class Sublog 
    { 
    public: 
    Sublog(const std::string& message) 
    { 
     std::cout << message; 
    } 

    void addText(const std::string& message) 
    { 
     std::cout << message; 
    } 

    ~Sublog() 
    { 
     std::cout << std::endl; 
    } 

    Sublog& operator<<(const std::string& message) 
    { 
     this->addText(message); 
     return *this; 
    } 
    }; 

}; 

Log::Sublog operator<<(Log& log, const std::string& message) 
{ 
    return Log::Sublog(message); 
} 

을 제공한다

int main() 
{ 
    Log log; 
    log << "Foo" << "bar"; 
    log << "baz" << "plop"; 
} 

각 세미콜론 다음에 서브 로그의 소멸자는


Klaim :

/** To allow streaming semantic on logs (used in << operator) . 
*/ 
class LogStreamer 
{ 
public: 

    LogStreamer(Log& log, const String& text) 
     : m_log(log) 
    { 
     m_log.addText(text); 
    } 

    ~LogStreamer() 
    { 
     m_log.logText(); 
    } 

    LogStreamer& operator<<(const String& text) 
    { 
     m_log.addText(text); 
     return *this; 
    } 

private: 

    Log& m_log; 

}; 

GCORE_API LogStreamer operator<<(Log& log, const String& message); 

과 CPP 파일 :

LogStreamer operator<<(Log& log, const String& message) 
{ 
    return LogStreamer(log, message); 
} 
+0

멋지다고 생각합니다. – Klaim

+0

와우, 임시 개체와 소멸자를 사용하여 생각하지 않았습니다. +1 – Ozan

+0

감사합니다. 작은 임시 객체가 하나만있어 정말 멋져졌습니다! 일부 세부 사항을 수정해야하므로 현재 전체 솔루션을 제공하는 게시물을 편집합니다. – Klaim

관련 문제