我有一个宏,它使用n
调用构造函数。
是否可以将其转换为constexpr并仍使用 func 的“本地” /“正确”版本?
log(n)
答案 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。