ドキュメントを解析し、派生クラスを呼び出して、ストリームで見つかった特定のイベントを通知するクラスがあります。パーサーはエンコーディングを処理し、ドキュメントの一部を文字列に再書き込みする必要があるため、仮想メソッドがオーバーライドされていない場合は再書き込みを避けたいと思います。疑似コード:
class Parser
{
virtual void Callback ( string )
{
// Do nothing
}
private:
void ParseFile()
{
// Parse the file in the files encoding
// Checks and more checks
// Found sth. So need to convert to a string a call the
// callback, but if there is no callback what's the point
// in wasting cycles?
if ( Callback ) // In the world of C we could check for a func pointer
Callback( /* with the string */ )
}
}
class User : public Parser
{
void Callback ( string )
{
// This string means sth. me
}
}
class NonUser : public Parser
{
// I don't care about Callback so I won't implement it
}
C コードでは、関数を作成し、その関数へのポインターを実装に渡します。内部的には、ポインターが何かを指しているかどうかを確認して呼び出します。派生クラスで同じことをどのように実装できますか? すなわち。仮想メソッドが実際に派生クラスに存在するかどうかを確認してから、時間/CPU サイクル/メモリを浪費して不要な文字列を作成します。
移植可能であれば、コンパイル時のチェックが理想的ですが、これはvテーブルと関係があると考えているため、実行時のチェックも機能する可能性があります。
さらに調査を重ねた結果、v-table が存在しないことが明らかになりました。これはほぼ不可能です。質問を少し変更して、何らかのタイプの、おそらくテンプレート、トリックを使用して上記が可能ですか?