赏金:这是我创造的最大和最恶心的黑客之一,但在我看来它足以用于调试原因
#include <iostream>
#include <typeinfo>
#define DEBUG_INSTANCE( classtype, name ) class _ ## classtype ## _INSTANCE_ ## name ## _ : public classtype \
{ \
public: \
_ ## classtype ## _INSTANCE_ ## name ## _ (){ } \
}; \
_ ## classtype ## _INSTANCE_ ## name ## _ name
class Foo {
public:
virtual void _MakeTypeIDRunTime() { }
// A virtual method in the class forces typeid(*this) to be used runtime rather than compiled
// See: https://stackoverflow.com/a/6747130/1924602
void Print();
};
void Foo::Print() {
std::cout << "Instance name = " << typeid(*this).name() << std::endl;
}
int main()
{
DEBUG_INSTANCE(Foo, a);
DEBUG_INSTANCE(Foo, b);
a.Print();
b.Print();
system("PAUSE");
return 0;
}
输出:
Instance name = ?AV_Foo_INSTANCE_a_@?1?main@
Instance name = ?AV_Foo_INSTANCE_b_@?1?main@
Press any key to continue . . .
该宏将创建一个继承 Foo 的类,并且 name 包含实例名称。唯一的限制是 Foo 有一个默认构造函数,并且必须包含一个虚方法,以便 typeid 接受继承的类并在运行时调用。有关更好的解释,请参阅https://stackoverflow.com/a/6747130/1924602
__VA_ARGS__
如果您使用宏,可能会支持构造函数