如何检查一个类是否在类中调用?

时间:2018-03-28 16:15:19

标签: c++ macros

说有一个宏:

DeadlockThread for monitor Monitor1 and Monitor2: Running
DeadlockThread for monitor Monitor1 and Monitor2: Got lock for monitor 'Monitor1'
DeadlockThread for monitor Monitor1 and Monitor2: Waiting to get lock on 'Monitor2'
DeadlockThread for monitor Monitor2 and Monitor1: Running
DeadlockThread for monitor Monitor2 and Monitor1: Got lock for monitor 'Monitor2'
DeadlockThread for monitor Monitor2 and Monitor1: Waiting to get lock on 'Monitor1'
DeadlockThread for monitor Monitor1 and Monitor2: Try to get lock on 'Monitor2'
DeadlockThread for monitor Monitor2 and Monitor1: Try to get lock on 'Monitor1'

foo定义为:

#define X(...) foo(__VA_ARGS__)

我想检查是否在类中调用X.如果在类中调用它,那么我可以调用第二个版本void foo(int a) {} template<class T> void foo(int a, T& t) { std::cout<<a<<t.b; } 。否则,我将调用第一个版本而不传递foo(100,*this)

3 个答案:

答案 0 :(得分:4)

严格来说,让宏观识别是否在某个类中调用它是不可能的。你看,宏是由预处理器扩展的 - 而不是由C ++编译器正确扩展;并且预处理器对C ++没有任何线索 - 它只适用于文本文件。当实际的编译器识别出类时,宏已经全部消失了。

但是,您可以使用更多宏来实现此目的:

#define IN_CLASS_FOO 1
class foo {
    /* ... whatever ... */
}
#undef IN_CLASS_FOO
#define IN_CLASS_FOO 0

有了这个,您可以修改X宏以使用IN_CLASS_FOO来控制其行为。请注意,如果您展开一些引用this变量的代码,即使您不在某个类中,也必须定义它,因此仍然无法使用它。

强烈反对您不这样做,但是 - 您最有可能通过完全避免使用宏来提供更好的服务。尝试使用constexpr function替换宏。

答案 1 :(得分:0)

问题中的信息太少,因此以下可以匹配或者可能不匹配......

class C
{
    void foo(int a)
    {
        ::foo(a, *this);
    //  ^^ resolves to global scope
        bar::foo(a, *this);
    //  ^^ assuming foo resides in namespace "bar"
    }
};

所以你现在有一个成员函数,只要你调用e就会被选中。 G。类上下文中的foo(77),否则,将选择free foo重载。宏没有意义,只需放弃它。

如果您可以将模板参数解析为类C,即使从子类中调用,也可以从C继承而不必重复此代码每个子类。否则,你将逃脱curiously recurring templates ......

答案 2 :(得分:0)

关键字 this 在任何非静态成员函数的主体中都可用。 有一次我在宏中看到一段很旧的代码,如下所示:

__if_exists(this) \
  { \
  // Do something
  } \

语句 __if_exists 在编译时检查标识符是否在此范围内可用。

但是要注意,只有MSVS支持,一般情况下,代码中使用这样的东西是不好的。