私の友人は、今日、私に次のチャレンジを送ってくれました。
次のコードを前提として
OBJECT_HAS_VTABLE
、プログラムがを出力するようにの実装を提案しますAnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1
。
class AnObject
{
int m_a;
void DoSomething() {}
public:
AnObject() {m_a = 0;}
};
class AnObjectWithVTable
{
int m_b;
virtual void DoStuff() { }
public:
AnObjectWithVTable() {m_b = 0;}
};
void main()
{
printf("AnObject has a vtable = %i, AnObjectWithVTable has a vtable = %i\n",
OBJECT_HAS_VTABLE(AnObject),
OBJECT_HAS_VTABLE(AnObjectWithVTable));
}
私は私が十分にまともだと思う次の解決策を思いついた:
template <typename T>
bool objectHasVtable()
{
class __derived : public T {};
T t;
__derived d;
void *vptrT=*((void **)&t);
void *vptrDerived=*((void **)&d);
return vptrT != vptrDerived;
}
#define OBJECT_HAS_VTABLE(T) objectHasVtable<T>()
この問題に対するより良い解決策はありますか?
編集
ソリューションは、すべてのコンパイラで一般的である必要はありません。gcc、g ++、MSVCで動作します...ソリューションが有効であることがわかっているコンパイラを指定するだけです。鉱山はMSVC2010用です。