Можно ли получить значение `__func__` в constexpr? - PullRequest
1 голос
/ 27 апреля 2019

У меня есть макрос, который вызывает конструктор с __func__. Можно ли преобразовать его в constexpr и при этом использовать «локальную» / «правильную» версию func ?

#define LOG_SCOPE_DURATION(category_arg) \
  ScopeDuration __scopeDuration = ScopeDurationConstructor(category_arg, __func__);

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Можно ли получить значение __func__ в constexpr?

Да.

Возможно ли преобразовать [мой макрос] в constexpr?

Нет.Если вы используете __func__ в функции constexpr, то вы получите имя функции constexpr;вы не получите имя того, что вызывает функцию, которое вы получите при развертывании макроса препроцессора.

1 голос
/ 27 апреля 2019

Если вы используете C ++ 17 или более раннюю версию, вы не можете преобразовать свой макрос в функцию. Самое близкое, что вы можете получить, это создание функции, которая принимает местоположение и использует его.

Обратите внимание, что макросы могут создавать встроенные переменные для вас, функция никогда не добавит никаких переменных в ваш текущий кадр стека. Таким образом, вместо этого вы можете добавить [[nodiscard]] к функции, чтобы не игнорировать возвращаемое значение.

template<typename T>
[[nodiscard]] constexpr ScopeDuration createScopeDuration(T &&t, const char *location)
{
    return ScopeDurationConstructor(std::forward<T>(t), location);
}
#define LOG_SCOPE_DURATION(category_arg) NS::createScopeDuration(category_arg, __func__)

Использование:

 auto scope = LOG_SCOPE_DURATION(argument);

Это в основном функция ScopeDurationConstructor.

Надеюсь, начиная с C ++ 20, вы можете использовать std::source_location, который является constexpr. В этом случае вы можете написать:

template<typename T>
[[nodiscard]] constexpr ScopeDuration createScopeDuration(T &&t, const std::source_location& location = std::source_location::current()))
{
    return ScopeDurationConstructor(std::forward<T>(t), location.function_name());
}

Использование:

auto scope = createScopeDuration(argument);

Опять же, вы можете включить все это в конструктор ScopeDuration.

Обратите внимание, что эта функция была одобрена для C ++ 20, однако формулировка еще не была добавлена ​​в стандарт. Подробнее см. отчет о поездке .

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