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」を呼び出しません。私は自分の質問に直接答えることを好みます。過負荷を判断するために実際の問題について説明します。また、一般的な問題に取り組む他の方法を示す回答をいただければ幸いです。

さて、それはコンパイルされます、私はまだ私の実際のコードとの違いを見つけていません、それはそうではありませんでした。ちなみに、私の実際のコードでは、関数の呼び出しを避けようとしているだけでなく、さらにいくつかあります。関数がオーバーライドされているのか、それともまったく別の方法を使用する必要があるのか​​を本当に知りたいです。

4

2 に答える 2

1

ここで動作します。ところで、最も簡単なアプローチは、空として定義f()することです。A

struct A{ void func(){ } };
于 2011-09-14T20:56:41.700 に答える
0

あなたが具体的に求めていることを行う方法はわかりませんが、いくつかのクールなパターンを使用して、テンプレートを使用して「静的ポリモーフィズム」を実現できます。これにより、実行時にvテーブルを使用することへの依存がなくなります(実際には、多形のような効果を実現するために使用されるものはありません)。したがって、必要な関数が使用可能かどうかをコンパイル時に確認できるはずです。

ウィキペディアのテンプレートメタグログラミングエントリには、それについて少し紹介があります。

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

ただし、コードがより複雑になるため、この機能を必要としない再設計について考える必要があると思います。これは、リフレクション属性であり、C++はまだあまり得意ではありません:(

于 2011-09-14T20:44:32.967 に答える