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





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