15

MSDN のどこかで、C# の "is" キーワードに相当するものは dynamic_cast になると読んだことがありますが、実際には同等ではありません。値の型やジェネリック パラメーターでは機能しません。たとえば、C# では次のように記述できます。

void MyGenericFunction<T>()
{
    object x = ...
    if (x is T)
        ...;
}

「同等の」C++/CLI を試してみると、次のようになります。

generic<class T>
void MyGenericFunction()
{
    object x = ...
    if (dynamic_cast<T>(x))
       ...;
}

「エラー C2682: 'dynamic_cast' を使用して 'System::Object ^' から 'T' に変換できません」というコンパイラ エラーが発生します。

私が考えることができる唯一のことは、リフレクションを使用することです:

if (T::typeid->IsAssignableFrom(obj->GetType()))

これを行う簡単な方法はありますか?

4

3 に答える 3

16

それはMSDNにあります:

方法: C++ で is and as C# キーワードを実装する

簡単に言えば、次のようなヘルパー関数を記述する必要があります。

template < class T, class U > 
Boolean isinst(U u) {
   return dynamic_cast< T >(u) != nullptr;
}

次のように呼び出します。

Object ^ o = "f";
if ( isinst< String ^ >(o) )
    Console::WriteLine("o is a string");
于 2009-04-03T08:02:30.057 に答える
7

ネイティブ C++ で使用するsafe_cast場所を使用して、System::InvalidCastException をトラップできます。互換性のある型dynamic_castに関しては、型を変換できるかどうかを尋ねるセマンティクスは、同一性を確認するよりも幅広い型を取り上げることができます。実際には、IsAssignableFrom の追加の柔軟性が必要になる場合があります。

私たちが慣れ親しんだ古き良きイディオムに相当する効率的なものはないと思いますdynamic_cast。確かにコンパクトなものはありません。

于 2009-04-03T08:00:39.453 に答える