Детектирование статической функции
Есть такой макрос
#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 шт):
При желании можно изловчиться определять, находится ли блок кода внутри статической или нестатической функции, например вот так:
#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
Однако использовать this все равно не выйдет, так как это ключевое слово не может появляться в статических функциях и подобная ситуация приведет к ошибке синтаксиса еще до того, как будет вычислено if constexpr. И вообще, макросы - зло. Делайте нормальные функции.