是否可以检测是否声明了局部变量?

时间:2018-11-12 13:31:07

标签: c++

是否可以检测是否声明了局部变量?

原因是我想有一个宏(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

3 个答案:

答案 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");
}

online compiler

答案 1 :(得分:0)

不。没有反思,您将无法自主地做这样的事情。再说一次,在这里没有什么好处。

相反,您应该简单地重组宏。 作为程序员,知道在编写宏时变量是否在范围内,并且可以使用不需要现有变量的 different

答案 2 :(得分:0)

您将无法通过局部变量执行此操作。如果需要RAII样式范围的日志记录工具,则别无选择,只能显式创建本地对象。

LogScope logscope("some log msg");

如果不需要RAII,则可以有一个将__FUNCTION__映射到日志上下文的全局日志对象。

#define LOG(msg) { \
    auto& logScope = g_logManager[__FUNCTION__]; \
  }