C++0xの標準ライブラリには
型が多態的に振る舞うか(つまり、仮想関数テーブルを持っているか)どうかを
判定するメタ関数があります。
is_polymorphicの実装は、指定された型を継承してみてサイズをチェックする、というものになるはずですが
#include <iostream> using namespace std; template <class T> class is_polymorphic { template <class U> struct first : public U {}; template <class U> struct second : public U { virtual void dummy(); virtual ~second(); }; public: static const bool value = sizeof(first<T>) == sizeof(second<T>); }; struct X {}; struct Y { virtual ~Y(); }; int main() { cout << is_polymorphic<X>::value << endl; // false cout << is_polymorphic<Y>::value << endl; // true }
(※簡易版なので組み込み型は無視してます)
C++0xで導入されるfinal属性を付加されたクラスは、継承(してオーバーライド)するとエラーになってしまうので
is_polymorphic使えないんじゃないだろうか。
struct X [[final]] {}; bool b = is_polymorphic<X>::value; // エラー!Xは継承できない!
うーん、final属性で特殊化とかできないよなー。どうするんだろ。