是否可以隐藏像BOOST_LOG_TRIVIAL(lvl)这样的宏

Is it possible to hide a macro like BOOST_LOG_TRIVIAL(lvl)

本文关键字:lvl LOG 隐藏 是否 BOOST TRIVIAL      更新时间:2023-10-16

我已经在一个项目中使用boost.log一段时间了,这是一个非常棒的日志库。但是要使用像BOOST_LOG_TRIVIAL(lvl)这样的基本日志,我需要包含boost/log/trivial.hpp这将导致许多与提升相关的东西被确定范围。

有没有办法(比如使用包装器或别名(来"隐藏"boost/log/trivial.hppBOOST_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循环,我不知道如何包装它。

这是复制该宏正在执行的操作的一项重要任务。你也需要一个宏,但如果你想在实现单元中隐藏所有提升细节,那么你需要以某种方式复制方法调用。

首先,您需要一个围绕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()

您需要实现 recordrecord_pump 接口的必要位。