Java の C++ に相当するものを実現するための推奨される方法は何instanceof
ですか?
5 に答える
使用してみてください:
if(NewType* v = dynamic_cast<NewType*>(old)) {
// old was safely casted to NewType
v->doSomething();
}
これには、コンパイラで rtti サポートを有効にする必要があります。
編集:この回答について良いコメントがありました!
dynamic_cast (または instanceof) を使用する必要があるたびに、それが必要かどうかを自問することをお勧めします。これは一般的に、設計が不十分であることを示しています。
典型的な回避策は、チェックしているクラスの特別な動作を基本クラスの仮想関数に入れるか、インターフェースを変更せずにサブクラスに特定の動作を導入できるビジターのようなものを導入することです (ビジター受け入れインターフェースの追加を除く)コース)。
指摘したように、dynamic_cast は無料ではありません。ほとんどの (すべてのケースではありませんが) を処理する単純で一貫して実行されるハックは、基本的に、クラスが持つことができるすべての可能な型を表す列挙型を追加し、正しいものを取得したかどうかを確認することです。
if(old->getType() == BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
これは良い oo 設計ではありませんが、回避策になる可能性があり、そのコストは多かれ少なかれ仮想関数呼び出しだけです。また、RTTI が有効になっているかどうかに関係なく機能します。
このアプローチは複数レベルの継承をサポートしていないことに注意してください。注意しないと、次のようなコードで終わる可能性があります。
// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
dynamic_cast
非効率であることが知られています。継承階層を上にたどります。複数レベルの継承があり、オブジェクトがその型階層内のいずれかの型のインスタンスであるかどうかを確認する必要がある場合は、これが唯一の解決策です。
ただし、オブジェクトが指定したタイプと正確に一致するかどうかのみをチェックするより限定された形式でinstanceof
十分である場合は、以下の関数の方がはるかに効率的です。
template<typename T, typename K>
inline bool isType(const K &k) {
return typeid(T).hash_code() == typeid(k).hash_code();
}
上記の関数を呼び出す方法の例を次に示します。
DerivedA k;
Base *p = &k;
cout << boolalpha << isType<DerivedA>(*p) << endl; // true
cout << boolalpha << isType<DerivedB>(*p) << endl; // false
テンプレートの型A
を (チェックする型として) 指定し、テストするオブジェクトを引数として渡します (そこからテンプレートの型K
が推論されます)。
#include <iostream.h>
#include<typeinfo.h>
template<class T>
void fun(T a)
{
if(typeid(T) == typeid(int))
{
//Do something
cout<<"int";
}
else if(typeid(T) == typeid(float))
{
//Do Something else
cout<<"float";
}
}
void main()
{
fun(23);
fun(90.67f);
}