TL; DR
Есть ли способ обнаружить использование макросов / шаблонов / магии, если функция была вызвана из функции-члена или из свободной / статической функции?
Некоторый контекст
В целях отладки я реализовал макрос под названием TRACE(fmt, ...)
, который записывает в файл сообщение с форматированным выводом, с дополнительной информацией для контекста (например, отметка времени, файл, функция). Например, при вызове TRACE("Hello %s", "world!");
будет записано (2/10/2019 22:32:58 func@file.cpp:27) Hello world!
.
Недавно я заметил, что в функциях-членах я обычно печатаю адрес объекта (this
), чтобы иметь некоторый дополнительный контекст и различать вызовы. членам различных объектов.
Поскольку эта необходимость очень распространена, я бы хотел улучшить свой макрос TRACE
для вывода this
, если он вызывается из функции-члена. К сожалению, я понятия не имею, как реализовать эту проверку - «вызывается из контекста члена?»
Чтобы уточнить, я хочу реализовать макрос TRACE, который действует как и раньше в функциях, не являющихся членами, нов функциях-членах выходное сообщение будет отличаться и будет больше похоже на (2/10/2019 20:32:58 func@file.cpp:27 0x80808080) Hello world!
.
. Для этого, я думаю, мне нужно провести различие между «макрос вызывается из функции-члена» и «макрос вызывается изфункция, не являющаяся членом ".
Мои вопросы
- Могу ли я каким-то образом проверить, был ли вызван мой макрос из функции-члена или нет?
- Если нет, могу ли якаким-то образом реализовать макрос
TRACE
, который я хочу иметь?
Обратите внимание, что я использую GCC, но я бы предпочел кросс-платформенное решение.
То, что я пробовал
Сначала я попытался проверить, определено ли this
, но, поскольку это ключевое слово, оно всегда "не определено" (defined(this)
равно false). Более того, если я пытаюсь использовать this
вне функции-члена, я получаю ошибку компиляции. В GCC это invalid use of 'this' in non-member function
. Поэтому, похоже, что решение должно будет получить эту информацию более хакерским способом, но я не уверен, каким она должна быть.
В качестве примера того, как выглядит мой макрос TRACE
, вы можете увидеть эту ссылку . Мне бы хотелось, чтобы использование TRACE
в функции-члене (например, в ctor A
) "автоматически" печатало значение this
, без необходимости явно передавать его макросу