Единый способ получить адрес объекта или 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)
Другие вопросы по тегам