Моя текущая реализация, упрощенная:
#include <string>
#include <memory>
class Log
{
public:
~Log() {
// closing file-descriptors, etc...
}
static void LogMsg( const std::string& msg )
{
static std::unique_ptr<Log> g_singleton;
if ( !g_singleton.get() )
g_singleton.reset( new Log );
g_singleton->logMsg( msg );
}
private:
Log() { }
void logMsg( const std::string& msg ) {
// do work
}
};
В общем, я удовлетворен этой реализацией, потому что:
- ленивый экземпляр означает, что я не плачу, если я его не использую
- Использование unique_ptr означает автоматическую очистку, поэтому valgrind счастлив.
- относительно простая, понятная реализация
Однако отрицательные стороны:
- синглеты не способствуют единичному тестированию
- диссонанс в глубине моего сознания для введения псевдоглобального (немного запаха кода)
Итак, вот мои вопросы, направленные на тех разработчиков, которые успешно изгоняют все синглтоны из своего кода на С++:
- Какую не-синглтонскую реализацию вы используете для ведения журнала приложений?
- Является ли интерфейс простым и доступным как вызов Log:: LogMsg() выше?
Я хочу, чтобы избежать передачи экземпляра журнала по всему моему коду, если это вообще возможно, - обратите внимание: я спрашиваю, потому что я тоже хочу изгнать всех синглов из моего кода, если есть хорошая, разумная альтернатива.