Я думаю, что это невозможно без изменения кода в вашем классе, в который вы хотите войти. Однако, если вы готовы сделать это, вы можете получить все классы, для которых вы хотите вести журналирование, из шаблона, подобного этому:
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)