2011-09-14 9 views
2

で非仮想オーバーライドを検出するために、私は関数は(静的)派生クラスでオーバーライドされたかどうかを検出したい:場合は明らかにどのようにコンパイルまたは実行時

template< typename T > 
struct A{ void func(){ static_cast<T*>(this)->func(); } }; 
struct B: A<B>{}; 
struct C: A<C>{ void func(){ std::cout << "class C" << std::endl; }; 

C c; 
if(&A<C>::func != &C::func) 
    c.func(); 

、私は「FUNC」をコールすることはありませんオーバーライドはありません。 私は自分の質問に直接答えが好きです。オーバーロードを判断するために実際の問題について説明します。 一般的な問題にアプローチするための他の方法を示す回答もありがとう。

これはコンパイルされていますが、実際のコードとの違いはまだわかりません。 ところで、私の実際のコードでは、単に関数を呼び出すことを避けようとしているわけではありません。関数がオーバーライドされているかどうか、まったく異なるメソッドを使用する必要があるかどうかを本当に知りたいです。

+1

これは、SFINAEの仕組みとよく似ています。 http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error –

+0

あなたのコードは意味をなさない: 'A'はテンプレートですが、2行目の下ではテンプレート以外のテンプレートのように使います。 –

+0

まあ、このポインタの比較は、すべてのコンパイラエラーを修正すると動作するように見えます。そう? – UncleBens

答えて

1

作品hereところで最も簡単な方法は、空のようAf()を定義するには、次のようになります。

+0

実際には、あなたのタイプミスを修正した後に動作するあなたの権利。なぜ私の実際のコードがわからないのですか? しかし空の 'func'は私には意味がありません。ウィキペディアでCRTPを見て、これは私がやることです。大まかに。 – Ingo

+0

おそらく、コンパイラにはバグがあります。 gccの他のバージョンでは動作しません。 – jpalecek

0

あなたが具体的に求めていることをする方法はわかりませんが、クールなパターンを使ってテンプレートを使って "静的多型"を達成することができます。これにより、実行時にvテーブルを使用する依存関係がなくなります(実際には、多態的な効果を達成するために使用されているものはありません)。したがって、必要な機能が利用可能かどうかをコンパイル時に確認することができます。

それについて少しイントロは、ウィキペディアのテンプレートmetagrogrammingエントリにあります:

http://en.wikipedia.org/wiki/Template_metaprogramming

それはしかし、あなたのコードはより複雑になりますので、私はあなただけのこれを必要としない再設計を考えるべきだと思います機能 - 反射属性のそのよりC++はまだのように、その時に非常に良いではありません:(

関連する問題