Мой друг прислал мне сегодня следующий вызов:
Учитывая следующий код, предложите реализацию
OBJECT_HAS_VTABLE
поэтому программа печатаетAnObject имеет vtable = 0, AnObjectWithVTable имеет 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>()
Is Есть ли лучшее решение этой проблемы?
Править
Решение не должно быть общим для всех компиляторов. Он может работать на gcc, g ++, MSVC ... Просто укажите, для какого компилятора ваше решение известно как действительное. Моя предназначена для MSVC 2010.