2013-06-24 11 views
5

그래서 모든 로깅 목적으로 Boost.Log를 사용하고 싶습니다. 나는 현재 도우미 메서드를 인스턴스화하고 설정하는 데 필요한 모든 작업을 포함하는 클래스를 작성했습니다.오버로드 << 부스트 로깅 객체를위한 연산자

< < 연산자에 과부하로 문제를 적용하여 문제를 해결할 수 없습니다. 서로 다른 인수 유형을 갖는 것이 가장 큰 문제인 것 같아서 사용할 수 있기를 원합니다. 여기

내가 뭘하려 :

template <typename T> 
void trace::operator <<(T data) 
{ 
    std::string text=boost::lexical_cast<std::string>(data); 
    std::cout<<data<<std::endl; 
    BOOST_LOG_TRIVIAL(debug) << text; 
} 

그러나, 나는이 그것은 논리의에 약간의 결함이 이해합니다. 여러 args를 < <으로 전달하려면 재귀 적이어야합니다. 하지만 부스트 로그로 어떻게 처리하는지 조금 혼란 스럽습니다.

편리한 부스트 매크로 대신 사용자 정의 싱크를 사용하여 로그 시스템을 정의해야합니까? 그렇다면 표준 지원 : ostream 반환이 지원합니까? 나는 이것이 반환 값과 입력 값을 스트림으로 추측하고있다.

+0

사용자 지정 개체에서이 기능을 사용하고 싶습니다. 나 자신의 '로깅'개체를 원하는 여러 스레드가 있습니다. – bge0

답변

3

질문을 올바르게 이해하면 < < 연산자를 사용하여 개체에 대한 정보를 기록해야합니다.

class your_class_t{ 
public: 
    std::string m_data; 
    int m_value; 

    friend std::ostream& operator<< (std::ostream& oss, your_class_t const & val) { 
    oss<<val.m_data << ": " << val.m_value; 
    return oss; 
    } 
} 

이 그럼 당신은 ostream에 당신의 클래스를 밀어 수 있습니다 :

your_class_t mytest; 
mytest.m_data = "hi"; 
mytest.m_value = 123; 
BOOST_LOG_TRIVIAL(debug) << mytest; 

당신은 얻을 것이다 로그인 사용 ostream에 호환 연산자를 밀어 , 그래서 당신이 필요로하는 모든 클래스에 대한 < < 연산자를 정의하는 것입니다 hi: 123

+1

참고 : STL! = C++ 표준 라이브러리. STL에는 iostream 기능도 포함되어 있지 않았습니다. – Aleph

+0

감사합니다. STL이 아니지만 표준입니다. – Heavy