Если вы используете 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, однако формулировка еще не была добавлена в стандарт. Подробнее см. отчет о поездке .