報奨金について: これは私が今まで作成した中で最大かつ最も嫌なハックの 1 つですが、私の意見では、デバッグの理由には十分です。
#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__
マクロを使用すると、コンストラクターをサポートできる可能性があります