Как определить, есть ли в классе C ++ виртуальная таблица?

Мой друг прислал мне сегодня следующий вызов:

Учитывая следующий код, предложите реализацию 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.

10
задан joce 2 July 2019 в 18:36
поделиться