2012-01-10 11 views
10

私は、いくつかのハンドルが適切に処理されることを保証するために、簡単なRAIIクラスを持っています。今私は誰もそれに偶然仮想メソッドを追加するつもりはないと主張したいと思います。私がそれを見る方法では、クラスにvtblポインタがないと主張する必要があります。レイアウトに特定のクラスにvtblポインタがないことをアサートする方法はありますか?

どうすればいいですか?コンパイル時にアサートすることは可能ですか?

EDIT

私はデスクトップのコンパイラのために解決します。私が知る限り、多態性の実装にvtblを使用していないデスクトップC++コンパイラはありません。

+0

理論上、ポータブルな方法でこれを行うことはできません。 –

+0

_sealed_クラスの取得に興味があります。http://stackoverflow.com/q/4712992/96780 –

+2

vtblは実装の詳細です。仮想関数を実装するために呼び出しテーブルを使用しないコンパイラが存在する可能性があります。ある特定のコンパイラに自分自身を制限したいですか? – filmor

答えて

19

あなたがC++ 11のライブラリを持っている場合は、あなたがstd::is_polymorphic<T>を使用することができます。

Tが多型クラスである場合(つまり、少なくとも1つの仮想関数を宣言または継承するクラスである)、を提供メンバ定数はtrueと等しい。他のタイプの場合、値はfalseです。

+0

+1してください。 – jrok

+1

+1、素敵!また、C++ 11をお持ちでなく、Visual C++をお持ちの場合は、 '__is_polymorphic'があります - http://msdn.microsoft.com/en-us/library/ms177194%28v=VS.90%29.aspx – sharptooth

+0

ニース。私は彼らがC++ 11でより静的な型の情報/反射機能を導入したかったと思っています(クラスのためのフィールド/メソッドのリストを得る方法のように)。これにより、スクリプト言語用のラッパーのようなメタコードを作成するのがずっと簡単になります。 – Kos

関連する問題