Детектирование статической функции

Есть такой макрос

#define TEST printf("%p", this)

Когда его вызываешь из обычного метода - проблем нет

void CMyClass::Test() {
  TEST;
}

Но когда его вызываешь из статического метода

static void CMyClass::TestStatic() {
  TEST;
}

получаешь ошибку о том, что идентификатор this не определен. Что логично.

Вопрос: а нельзя ли как-то определить, что мы находимся внутри статической функции и в соответствии с этим принимать решение об использовании кода? Т.е. как-то так

#define TEST \
  #if declared(this) \
    printf("%p", this) \
  #else \
    printf("%p", nullptr) \
  #endif

или так

#define TEST \
  if constexp (is_declared(this) \
    printf("%p", this); \
  else \
    printf("%p", nullptr)

Макрос используется для логирования вызовов


Ответы (1 шт):

Автор решения: user7860670

При желании можно изловчиться определять, находится ли блок кода внутри статической или нестатической функции, например вот так:

#include <source_location>
#include <iostream>
#include <string_view>

#define CHECK_STATIC                                          \
    if constexpr                                              \
    (                                                         \
        ::std::string_view::npos != ::std::string_view        \
        {                                                     \
            ::std::source_location::current().function_name() \
        }.find("static ")                                     \
    )                                                         \
    {                                                         \
        ::std::cout << "in static" << ::std::endl;            \
    }                                                         \
    else                                                      \
    {                                                         \
        ::std::cout << "in non-static" << ::std::endl;        \
    }

struct Struct
{
    void NonStatic(void)
    {
        CHECK_STATIC;
    }
    static void Static(void)
    {
        CHECK_STATIC;
    }
};
 
int main(int, char const* const[])
{
    Struct s{};
    s.NonStatic();
    s.Static();
    return 0;
}

--std=c++20 -Wall -Wextra -Wconversion -Wpedantic

in non-static
in static

online compiler

Однако использовать this все равно не выйдет, так как это ключевое слово не может появляться в статических функциях и подобная ситуация приведет к ошибке синтаксиса еще до того, как будет вычислено if constexpr. И вообще, макросы - зло. Делайте нормальные функции.

→ Ссылка