是否可以检测是否声明了局部变量?
原因是我想有一个宏(value = map[123]
),它具有如下逻辑:
LOG
因此,如果宏看到存在名为if (<logContext is declared>) {
log(logContext, <parameters>);
} else {
DefaultLogContext logContext(*this);
log(logContext, <parameters>);
}
的局部变量,则它将此变量传递给logContext
。如果log
不存在,则会创建一个默认的logContext
,并将其传递给logContext
。
注意:log
是从属类型。这意味着该日志记录宏只能在类成员函数中使用,并且此类型是实际依赖于类型的DefaultLogContext
类的类型定义:
LogContext
答案 0 :(得分:3)
有点丑陋的解决方案,用于检查是否存在名为local_context
的局部变量:
#include <iostream>
#include <type_traits>
constexpr class t_Decoy{} const local_context; // should be declared in global scope
class t_Context{};
#define LOG(text) \
[&](char const * const psz_text) -> void \
{ \
if constexpr(::std::is_same_v<t_Context, decltype(local_context)>) \
{ \ // we can use captured local_context here
::std::cout << psz_text << " has local_context" << ::std::endl; \
} \
else \
{ \ // we can create default context using captured this
::std::cout << psz_text << " no local_context" << ::std::endl; \
}\
}(text)
int main()
{
LOG("first");
t_Context local_context{};
LOG("second");
}
答案 1 :(得分:0)
不。没有反思,您将无法自主地做这样的事情。再说一次,在这里没有什么好处。
相反,您应该简单地重组宏。 您作为程序员,知道在编写宏时变量是否在范围内,并且可以使用不需要现有变量的 different 宏
答案 2 :(得分:0)
您将无法通过局部变量执行此操作。如果需要RAII样式范围的日志记录工具,则别无选择,只能显式创建本地对象。
LogScope logscope("some log msg");
如果不需要RAII,则可以有一个将__FUNCTION__
映射到日志上下文的全局日志对象。
#define LOG(msg) { \
auto& logScope = g_logManager[__FUNCTION__]; \
}