Ich habe irgendwo auf MSDN gelesen, dass das Äquivalent zu Cis 'ist "Schlüsselwort wäre dynamic_cast, aber das ist nicht wirklich gleichwertig: Es funktioniert nicht mit Werttypen oder mit generischen Parametern. Zum Beispiel in C# kann ich schreiben:C++/CLI-Frage: Gibt es ein Äquivalent zum C# "is" -Schlüsselwort oder muss ich reflection verwenden?
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
Wenn ich das "Äquivalent" C++/CLI versuchen:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
ich einen Compiler-Fehler „Fehler C2682 erhalten: kann nicht 'dynamic_cast' verwenden, um von zu konvertieren 'System :: Object ^' bis 'T' ".
Das einzige, was ich denken kann, ist die Reflexion zu nutzen:
if (T::typeid->IsAssignableFrom(obj->GetType()))
Gibt es einen einfacheren Weg, dies zu tun?
Vielleicht haben Sie meine Frage missverstanden. Ich kenne diesen MSDN-Artikel. Ich habe es in meiner Frage erwähnt. Und ich erklärte, warum es nicht für mich funktioniert. dynamic_cast entspricht nicht C# "as". Es funktioniert nur für Referenztypen. – Niki
Ups, sollte Fragen genauer lesen. Es funktioniert für generische Typen, aber nicht für Werttypen. –
C# ''as' funktioniert auch nicht für Werttypen:' dynamic_cast' ist das genaue Äquivalent von 'as'. Verwenden Sie 'safe_cast' zum Umwandeln in Werttypen. Die Semantik ist äquivalent zu der von C#: Wirf eine Exception für schlechte Casts, um Typen zu typisieren, gebe 'Null' für schlechte Casts zu Referenztypen zurück. –