仮想関数があるかどうかの判定

調べたらあったので貼り付け。
boost::is_polymorphic ってのがあるみたいね。

#include 

template<
    typename T
>
struct is_polymorphic{
    struct A : public T{};
    struct B : public T{
        virtual ~B(){};
    };
    static const bool value = sizeof(A) == sizeof(B);
};

struct hoge{
    int a;
    ~hoge(){}
};
struct foo{
    virtual void func(){}
};

int
main(){
    
    std::cout << is_polymorphic::value << "\n"; // 0
    std::cout << is_polymorphic::value << "\n";  // 1
    
    return 0;
}

判定するクラスを継承するインナークラスを2つ用意して、
(ただし、片方は仮想関数を定義しておく)
sizeof() でサイズを比較した際に、同値なら
元々 vtable を持っていたって事になる。
実際にやってみるとどうって事は無いんだけど、
考えた人はすごいなぁ…。