Единый способ получить адрес объекта или NULL в глобальной функции
Я строю основанную на дереве систему отладки / ведения журнала для C++.
Его "пользовательский интерфейс" - это макрос, который передает пользовательское сообщение и информацию о месте вызова (файл, строка, адрес объекта) специальной функции, которая затем выполняет регистрацию.
Функция использует адрес объекта для группировки сообщений по экземпляру объекта.
В настоящее время это выглядит так:
// in logging system header
#define msg (event_level, message) \
do_logging_ (event_level, __FILE__, __LINE__, this, message)
...
// in code
msg (MSG_WARNING, "some text");
Я хочу спросить, есть ли какой-то единый способ (можно использовать в msg
макро) чтобы получить NULL
вместо this
где this
не определено (глобальные / статические функции)?
2 ответа
Вы можете изменить определение макроса:
#define msg (event_level, message, THIS) \
do_logging_ (event_level, __FILE__, __LINE__, THIS, message)
Использование:
msg (MSG_WARNING, "some text", this); // in member methods
msg (MSG_WARNING, "some text", NULL); // otherwise
Я думаю, что это невозможно без изменения кода в вашем классе, в который вы хотите войти. Однако, если вы готовы сделать это, вы можете получить все классы, для которых вы хотите вести журналирование, из шаблона, подобного этому:
template <typename T>
class loggable_class
{
protected:
T* get_this() { return static_cast <T*> (this); }
};
Например:
class A : public loggable_class<A>
{
...
};
Дополнительное глобальное определение функции get_this() будет использоваться в функциях, не являющихся членами:
inline void* get_this()
{
return NULL;
}
Макрос регистрации будет выглядеть так:
#define msg (event_level, message) \
do_logging_ (event_level, __FILE__, __LINE__, get_this(), message)