2013-06-24 3 views
5

Поэтому я хочу использовать Boost.Log для всех моих целей ведения журнала. В настоящее время я написал класс, который охватывает все необходимые операции создания экземпляров и настройки вспомогательных методов.Перегрузка << Оператор для ведения журнала ведения журнала

Проблема в том, что я хочу перегрузить оператора < <, чтобы использовать его в режиме cout. Я хочу, чтобы иметь возможность использовать его для того, чтобы иметь разные типы аргументов, кажется самой большой проблемой.

Вот что я пробовал:

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; 
} 

Однако, я понимаю, что это мало недостатков в его логике. Чтобы иметь возможность передавать несколько аргументов в < <, это должно быть рекурсивным. Но я немного смущен, как бы это сделать с помощью буфера.

Должен ли я определять систему журналов с помощью пользовательской раковины вместо удобного макроса boost? Если это так, то поддержка std :: ostream возвращается? Я предполагаю, что это будет возвращаемое значение и входное значение в поток.

+0

Я хочу использовать это в пользовательском объекте. У меня есть несколько потоков, для которых я хочу свой собственный «журнал». – bge0

ответ

3

Если я правильно понял ваш вопрос, вам необходимо записать информацию о вашем объекте, используя < < оператор. Повысьте Вход использует ostream-совместимых операторов, поэтому все, что вам нужно, чтобы определить < < оператора для класса:

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; 

Вы получите hi: 123

+1

Примечание: STL! = Стандартная библиотека C++. STL также никогда не содержал функции iostream. – Aleph

+0

спасибо, а не STL, но std – Heavy