仮想関数があるかどうかの判定
調べたらあったので貼り付け。
boost::is_polymorphic ってのがあるみたいね。
#includetemplate< 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 を持っていたって事になる。
実際にやってみるとどうって事は無いんだけど、
考えた人はすごいなぁ…。