2

Perl には UNIVERSAL::can メソッドがあり、任意のクラスまたはオブジェクトに対して呼び出して、何かを実行できるかどうかを判断できます。

sub FooBar::foo {}
print "Yup!\n" if FooBar->can('foo'); #prints "Yup!"

C++ に、さまざまな派生クラスのいずれかになる基本クラス ポインターがあるとします。これに似たものを簡単に実現する方法はありますか? 他の派生クラスでは何も変更する必要はありません。関数を呼び出す基本クラスと、それをサポートする 1 つの派生クラスの領域のみを変更できます。

編集:待ってください、これは明らかです(質問は気にしないでください)。UNIMPLEMENTEDを表す数値を返すベースに実装し、呼び出したときに戻り値がこれではないことを確認できます。なんでこんなに複雑に物事を考えていたのかわからない。

また、実装された別のクラスからクラスを派生fooさせ、このクラスへの動的キャストが機能するかどうかを確認することも考えていました。

4

4 に答える 4

7

基本クラスへのポインターまたは参照がある場合は、 を使用dynamic_castして、それがどの派生クラスであるか (したがって、どの派生クラスのメソッドがサポートされているか) を確認できます。

于 2009-09-03T18:33:12.457 に答える
5

基本クラスにメソッドを追加できる場合は、 を追加しvirtual bool can_foo() {return false;}て、foo を持つサブクラスでそれをオーバーライドして true を返すことができます。

于 2009-09-03T18:35:02.873 に答える
3

C++ にはランタイム リフレクションが組み込まれていません。クラス階層に独自のリフレクション実装を完全に自由に構築できます。これには通常、名前と関数のリストが取り込まれる静的マップが含まれます。利用したい各関数を手動で登録し、呼び出し規約と関数シグネチャに関して一貫性を保つ必要があります。

于 2009-09-03T18:33:44.217 に答える
2

最も正しい方法は、 typeid<> 演算子を使用して type_info オブジェクトへの参照を取得し、その (== 演算子) を必要なデータ型の目的の type_info と比較することだと思います。

これはメソッドレベルのインスペクションを提供せず、RTTI を有効にしてビルドする必要があります (RTTI なしでビルドされたオブジェクトで typeid<> を使用すると、「未定義」の動作が発生すると思います)、しかし、そこにあります。 .

MSDN には、開始するためのオンライン リファレンスがあります: http://msdn.microsoft.com/en-us/library/b2ay8610%28VS.80%29.aspx

于 2009-09-03T18:47:51.657 に答える