Есть ли какой-нибудь способ определить, позволяет ли контекст использовать «this»?

Есть ли способ определить, позволяет ли контекст использовать «это»?

Моя цель — написать общий макрос для ведения журнала, который в зависимости от контекста использует «this» (например, для вывода значения «this»).

3

Решение

Даже если бы ты мог сделать это, ты никогда не мог бы использовать это. Код должен быть законным, даже если он никогда не будет вызван, и упоминать о нем было бы неправильно this в таком контексте. Рассматривать:

if (this_is_legal())
std::cout << this << std::endl;
else
std::cout << "not in member function" << std::endl;

Ну, этот код не скомпилируется, даже если магия this_is_legal работал. Потому что первый std::cout строка не будет компилироваться в контексте, где this не законно

Вы могли бы сделать очень некрасиво const void *getThis() { return NULL; } как глобальная функция и const void *getThis() { return this; } как функция-член. Это даст вам функцию, которая возвращает NULL или же this, Вы должны надеяться, полагаясь на неопределенное поведение, что this указатель будет неизменен в базовом классе без переменных-членов.

2

Другие решения

Если вы можете позволить себе определить базовый класс для целей отладки, тогда определите глобальный и член класса debug функции. Функция-член может использовать this в то время как глобальный может использовать другую информацию, а правила области видимости могут выбрать правильный debug функция.

Другой способ — определить два макроса:

#define ENTER_CLASS_SCOPE
# undef IN_CLASS
# define IN_CLASS 1

#define EXIT_CLASS_SCOPE
# undef IN_CLASS
# define IN_CLASS 0

и иметь #define IN_CLASS 0 первоначально. Затем вы можете использовать эти макросы в верхней и в конце cpp файлы, определяющие функции-члены, и установите флажок в DEBUG макро.

1