Прежде всего, вы действительно хотите, чтобы ваше приложение молча игнорировало все, что вы делаете с этими синглетами, если они не будут выделены?Для чего-то вроде логгера вы можете использовать его для сообщения об исключениях, поэтому, возможно, вы не хотите, чтобы он тоже генерировал.
В таких случаях рассмотрите возможность вызова метода экземпляра при запуске приложения (например, в вашей основной точке входа), чтобы в случае успешного запуска приложения всегда был под рукой регистратор, например
Наконец, я рекомендую, чтобы m_instance использовал что-то вроде boost :: scoped_ptr, чтобы вы не теряли память (или просто сохраняйте регистратор как статический объект в методе экземпляра без косвенного указателя).Конечно, современные операционные системы, как правило, будут очищаться после вас, но если вы начнете выполнять анализ памяти для проверки на утечки, вы получите много ложных срабатываний таким образом.
Что касается этих макросов, ядумаю, что они зверские, но это только мое мнение.Подобные эффекты можно достичь без макросов:
void write_to_log(Logger* logger, const char* msg)
{
if (logger)
logger->log(msg);
}
или даже:
void write_to_log(const char* msg)
{
Logger* logger = Logger::instance();
if (logger)
logger->log(msg);
}