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

时间:2013-01-11 22:31:46

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

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

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

2 个答案:

答案 0 :(得分:2)

即使您可以这样做,也永远不会使用它。代码必须是合法的,即使它永远不会被调用,在这样的上下文中提及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指针将在没有成员变量的基类中被修改。

答案 1 :(得分:1)

如果您能够为调试目的定义基类,则定义全局和类成员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宏中的标记。