Проверка, если в контексте функции-члена - PullRequest
0 голосов
/ 02 октября 2019

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!.

. Для этого, я думаю, мне нужно провести различие между «макрос вызывается из функции-члена» и «макрос вызывается изфункция, не являющаяся членом ".

Мои вопросы

  1. Могу ли я каким-то образом проверить, был ли вызван мой макрос из функции-члена или нет?
  2. Если нет, могу ли якаким-то образом реализовать макрос TRACE, который я хочу иметь?

Обратите внимание, что я использую GCC, но я бы предпочел кросс-платформенное решение.

То, что я пробовал

Сначала я попытался проверить, определено ли this, но, поскольку это ключевое слово, оно всегда "не определено" (defined(this) равно false). Более того, если я пытаюсь использовать this вне функции-члена, я получаю ошибку компиляции. В GCC это invalid use of 'this' in non-member function. Поэтому, похоже, что решение должно будет получить эту информацию более хакерским способом, но я не уверен, каким она должна быть.

В качестве примера того, как выглядит мой макрос TRACE, вы можете увидеть эту ссылку . Мне бы хотелось, чтобы использование TRACE в функции-члене (например, в ctor A) "автоматически" печатало значение this, без необходимости явно передавать его макросу

...