Есть ли способ определить, позволяет ли контекст использовать «это»?
Моя цель — написать общий макрос для ведения журнала, который в зависимости от контекста использует «this» (например, для вывода значения «this»).
Даже если бы ты мог сделать это, ты никогда не мог бы использовать это. Код должен быть законным, даже если он никогда не будет вызван, и упоминать о нем было бы неправильно 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
указатель будет неизменен в базовом классе без переменных-членов.
Если вы можете позволить себе определить базовый класс для целей отладки, тогда определите глобальный и член класса 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
макро.