可以在constexpr中获得__func__的值吗?

时间:2019-04-27 00:56:01

标签: c++ macros constexpr

我有一个宏,它使用n调用构造函数。 是否可以将其转换为constexpr并仍使用 func 的“本地” /“正确”版本?

log(n)

2 个答案:

答案 0 :(得分:2)

  

是否可以在constexpr中获得__func__的值?

是的

  

是否可以将[我的宏]转换为constexpr?

不。如果在constexpr函数中使用__func__,则将获得constexpr函数的名称;否则,将返回constexpr函数的名称。您不会获得调用该函数的名称,而在展开预处理器宏时会得到该名称。

答案 1 :(得分:1)

如果您使用的是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,但是该措辞尚未添加到标准中。有关更多详细信息,请参见trip report