Мой друг прислал мне следующий вызов сегодня утром:
Учитывая следующий код, предложите реализацию
OBJECT_HAS_VTABLE
чтобы программа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... Просто укажите, для какого компилятора известно, что ваше решение действительно. Мой для MSVC 2010.