Способы пользовательской регистрации в C ++ - PullRequest
4 голосов
/ 26 июля 2011

Я выполняю рефакторинг моего приложения на C ++.Раньше я использовал такой макрос, как

LOG("something interesting") // 1
LOG("something ended")       // 2
LOG("foo: " << bar)          // 3

Моя идея заключалась в том, чтобы написать класс Log примерно так:

Log(std::string _init_message):
    init_message(_init_message)
{   PrintLogLine(init_message + "   ...");}
~Log() 
{   PrintLogLine(init_message + " done.");}

, чтобы получить «автоматическую» запись определенных действий (например, когдаони запускаются, останавливаются + дополнительно время и т. д.), когда я использую его, как

void ActionXYZ() {
   Log log("xyz");
   // do stuff
}

Я пытаюсь найти способ заставить его работать для случая 3).В Java я мог бы использовать метод, который принимает один аргумент String, так как компилятор позаботится об автоматическом построении строк.Какие возможности у меня есть в C ++?

Можно ли заставить его работать так, чтобы я мог использовать его как один из вариантов?

 // in "do stuff"
 log("foo:" + bar); // OR
 log << "foo:" << bar;

Ответы [ 4 ]

3 голосов
/ 26 июля 2011

Как я уже упоминал в комментариях, вы можете использовать Boost.Format.Это также помогает с проблемой преобразования строк в строки и т. Д. Однако, это может быть немного многословно - чтобы избежать вызова .str() для вызова std::string конструктора, вы могли бы создать тот, который принимает boost::format напрямую.

Log log(boost::format("foo %1% bar") % 42); // with Log(boost::format)
Log log((boost::format("foo %1% bar") % 42).str()); // with only Log(std::string)

Подробнее см. В документации Boost.Format .

1 голос
/ 26 июля 2011

На ум приходят две непосредственные возможности. Первый - воспользоваться добавлением std :: string:

Log log(std::string("foo:") + bar);

Во-вторых, нужно создать больше log конструкторов, которые принимают дополнительные параметры:

Log log("foo:", bar);
0 голосов
/ 26 июля 2011

Вы можете создать класс ведения журнала, который наследуется от std :: strstream.

class Mstream : public std::strstream
{
  public:
  Mstream() : std::strstream(Buffer = new char[BUFLEN], BUFLEN, ios::out);
  ostream& endf(ostream& s);
  void Write();

  private:
  char* Buffer;
};

Теперь вы можете записать вывод как,

Mstream m; 
m <<"Foo"<<s<<endf;

В endf (ostream & s) вы можете привести ostream к Mstream и вызвать Write (). В Write () вы форматируете вывод и распечатываете его на консоль или в файл.

0 голосов
/ 26 июля 2011

Вы действительно должны рассмотреть возможность использования Boost.Log для ведения журнала.Регистрация может быть сложной вещью;полезно получить полностью сформированную реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...