【问题标题】:Is there some way to determine whether the context allows the use of "this"?有没有办法确定上下文是否允许使用“this”?
【发布时间】:2013-01-11 22:31:46
【问题描述】:

有没有办法确定上下文是否允许使用“this”?

我的目标是编写一个通用宏,用于记录,根据上下文使用“this”(例如,打印“this”的值)。

【问题讨论】:

  • 制作一个打印this 的版本和一个不打印的版本,并使用在类内执行的版本和不在类外的版本。 AFAIK 无法检查变量是否存在或您是否在成员函数中。
  • 什么是“这个”?你确定 c/c++ 是正确的标签吗?
  • @qPCR4vir 在 C++ 中,“this”是指向调用函数的成员的指针。他没有将其标记为“c/c++”,而是“c++”和“c++11”。
  • 是否可以仅检测我们是否处于从特殊父类派生的类的成员函数中?父类不需要有数据成员。
  • @user1476999:有两个版本的函数,“cont int inMember()”——一个返回零的全局版本和一个返回一的成员版本(在基类中)。

标签: c++ c++11 macros this compile-time


【解决方案1】:

即使你能做到这一点,你也永远无法使用它。代码即使永远无法被调用也必须是合法的,在这种情况下提及this 是不合法的。考虑:

if (this_is_legal())
   std::cout << this << std::endl;
else
   std::cout << "not in member function" << std::endl;

好吧,即使魔术 this_is_legal 起作用,这段代码也不会编译。因为第一行 std::cout 不会在 this 不合法的上下文中编译。

你可以做一个非常丑陋的const void *getThis() { return NULL; } 作为一个全局函数和const void *getThis() { return this; } 作为一个成员函数。这将为您提供一个返回NULLthis 的函数。依靠未定义的行为,您必须希望 this 指针在没有成员变量的基类中不会被修改。

【讨论】:

  • 显然可以使用模板或 MS 的 __if_exists 之类的东西
  • +1 我们真正需要的是“将其作为void* 或 null 如果不在成员函数中”作为单个表达式以使代码无论如何都可以工作,但这是循环的,因为它取决于原始问题。所以肯定是不可能的。
【解决方案2】:

如果您有能力为调试目的定义基类,则定义全局和类成员debug 函数。成员函数可以使用this,而全局函数可以使用其他信息,作用域规则可以选择正确的debug 函数。

另一种方法是定义两个宏:

#define ENTER_CLASS_SCOPE
# undef IN_CLASS
# define IN_CLASS 1

#define EXIT_CLASS_SCOPE
# undef IN_CLASS
# define IN_CLASS 0

最初使用#define IN_CLASS 0。然后您可以在定义成员函数的cpp 文件的顶部和末尾使用这些宏,并检查DEBUG 宏中的标志。

【讨论】:

  • 这听起来对我来说是一个非常聪明的解决方案!
  • 听起来像是一个巨大的维护头痛。在呼叫站点明确区分两者要容易得多;全局状态不好。
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 2011-02-12
  • 2022-12-19
  • 1970-01-01
  • 2018-09-06
  • 2010-09-12
  • 2011-08-26
  • 2015-07-28
相关资源
最近更新 更多