Обнаружение контекста функции-члена или не-члена («это» существует или нет) - PullRequest
0 голосов
/ 06 августа 2020

Допустим, у меня есть макрос. Есть ли способ определить, используется ли он в контексте функции-члена или не-члена? Т.е. существует ли указатель this или нет? Я пробовал использовать constexpr if, но не смог избавиться от ошибки invalid use of ‘this’ in non-member function:

#include <typeinfo>
#include <type_traits>

#define macro(a, b, c) \
  do { \
    const char* class_name; \
    if constexpr (std::is_class<decltype(*this)>::value) \
      class_name = typeid(*this).name(); \
    else \
      class_name = ""; \
  } while (0)

struct foo {
  void member () {
    macro(1, 2, 3);
  }
};

void non_member() {
  macro(4, 5, 6);
}

Я был бы признателен, если бы увидел, как эта проблема решается с помощью C ++ 14 (поскольку я привязан к it) и C ++ 20.

1 Ответ

0 голосов
/ 06 августа 2020

From constexpr if :

Если оператор constexpr if появляется внутри шаблонной сущности, и если условие не зависит от значения после создания экземпляра, исключенный оператор не создается при создании экземпляра включающего шаблона.

vs

Вне шаблона полностью проверяется отклоненный оператор. если constexpr не заменяет директиву предварительной обработки #if:

В вашем случае вы вызываете макрос и constexpr if внутри него в не шаблонной функции. Таким образом, доступ к несуществующему this плохо сформирован.

Кроме того, поскольку ваш constexpr if не обращается к параметрам шаблона, SFINAE не произошло, и даже это также позволит выражению внутри предложения if не удалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...