final属性のType Traitsへの影響

C++0xの標準ライブラリにはが追加され、その中にis_polymorphicという
型が多態的に振る舞うか(つまり、仮想関数テーブルを持っているか)どうかを
判定するメタ関数があります。


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属性で特殊化とかできないよなー。どうするんだろ。