Можно ли скрыть макрос типа BOOST_LOG_TRIVIAL(lvl)

Я некоторое время использовал 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, и я понятия не имею, как его обернуть.

Все вещи, используемые этим макросом (типы, функции и т. д.), должны быть объявлены или (в случае макросов) #defined. В противном случае любое использование макроса не будет компилироваться. Если вы действительно хотите «скрыть» использование макроса, напишите свою собственную ФУНКЦИЮ (не макрос), которая принимает аргументы соответствующих типов и использует макрос повышения. Затем объявите эту функцию в отдельном заголовочном файле и определите ее в отдельной единице компиляции (также известной как исходный файл). Если другие разработчики явно не #include добавят заголовок (что вы не можете предотвратить), они не смогут использовать макрос напрямую.

Peter 03.04.2019 09:57

@Peter Спасибо за помощь, и я пытаюсь создать класс-оболочку с переопределяющим оператором<<.

Alex.Don.Scofield 04.04.2019 08:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
297
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Во-первых, вам нужна оболочка для 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);  
}

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

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

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

На самом деле это не задача ez, но я пытаюсь создать класс-оболочку с переопределением operator<< . Спасибо за помощь

Alex.Don.Scofield 04.04.2019 08:57

Другие вопросы по теме