Можно ли скрыть макрос типа BOOST_LOG_TRIVIAL (lvl) - PullRequest
0 голосов
/ 03 апреля 2019

Я какое-то время использовал boost.log в одном проекте, и это действительно отличная библиотека журналов.Но для использования базового журнала, такого как BOOST_LOG_TRIVIAL(lvl), мне нужно включить boost/log/trivial.hpp, что приведет к большому количеству элементов, связанных с усилением.

Есть ли способ (например, использование обертки или псевдонима) "скрыть" boost/log/trivial.hpp и BOOST_LOG_TRIVIAL(lvl), поэтому я могу быть уверен, что любой другой разработчик может вызывать только завернутую версию BOOST_LOG_TRIVIAL(lvl)?

В самом начале я думал, что BOOST_LOG_TRIVIAL(lvl) был простым потоковым объектом, но потом я обнаружил, что он будет расширен как:

#define BOOST_LOG_STREAM_WITH_PARAMS_INTERNAL(logger, rec_var, params_seq)\
    for (::boost::log::record rec_var = (logger).open_record((BOOST_PP_SEQ_ENUM(params_seq))); !!rec_var;)\
        ::boost::log::aux::make_record_pump((logger), rec_var).stream()

Здесь есть цикл for, и я понятия не имею,как обернуть его.

1 Ответ

0 голосов
/ 03 апреля 2019

Это нетривиальная задача для копирования того, что делает этот макрос. Вам также нужен макрос, но если вы хотите скрыть все детали повышения в модуле реализации, вам нужно каким-то образом повторить вызовы методов.

Сначала вам нужно обертка вокруг boost::log::record, а затем обертка вокруг boost::log::record_pump<> и, наконец, методы для создания ваших экземпляров обертки. Конечный результат должен выглядеть примерно так:

namespace foo {
  enum severity {
    debug, info, warn, error;
  }

  struct record {
    // use pimpl to hide
  };

  struct record_pump {
    // use pimpl to hide
  };

  // This will call the trivial logger to create a record and then
  // wrap with your record
  record make_record(severity lvl);

  // This method will call the boost `boost::log::make_record_pump` method
  // with the trivial logger and wrap the resulting `record_pump<T>` by your wrapper
  record_pump make_record_pump(record& rec);  
}

Затем объявите макрос, который выглядит как макрос повышения - помните, что вам нужно выставить уровни в ваших собственных перечислениях

#define LOG(lvl) \
for (auto rec = foo::make_record(lvl); !!rec;) \
  foo::make_record_pump(rec).stream()

Вам потребуется реализовать необходимые биты интерфейса record и record_pump.

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