Я пытаюсь выяснить, как лучше всего использовать источник ведения журнала в классе. Прямое решение, просто определить его как переменную члена (стека), имеет большой недостаток, заключающийся в том, что я должен включать заголовочные файлы Boost.Log, что действительно замедляет компиляцию.
Я хотел бы использовать регистратор канала серьезности. Итак, мой первый подход состоял в том, чтобы определить новый тип, например:
#include <boost/log/sources/severity_channel_logger.hpp>
typedef boost::log::sources::severity_channel_logger_mt<SeverityLogLevel, std::string> DefaultLogger;
Этот подход только упрощает определение регистратора, но мне все равно нужно включить заголовочный файл.
Моей следующей идеей было создать новый класс, который является подтипом регистратора, а затем использовать предварительное объявление этого класса:
// MyLogger.h
class MyLogger : public boost::log::sources::severity_channel_logger_mt<SeverityLogLevel, std::string>
{
public:
MyLogger(const std::string& name);
};
// MyLoggingClient.h
include <memory>
class MyLogger;
class MyLoggingClient
{
// Actual implementation
private:
std::unique_ptr<MyLogger> lg;
};
Но при этом компилятор жалуется, что MyLogger не определяет бинарный оператор "[" или преобразование в тип, приемлемый для предопределенного оператора.
Итак, мой вопрос в том, что является хорошим способом просто переслать определение регистратора? (Я занимаюсь рефакторингом регистрации существующего кода, поэтому использование PIMPL или аналогичного шаблона потребует много дополнительных усилий.)
Спасибо, - Ларс