He leído en MSDN que el equivalente a la palabra clave "es" de C# sería dynamic_cast, pero eso no es realmente equivalente: no funciona con tipos de valores o con parámetros genéricos. Por ejemplo, en C# Puedo escribir:C++/CLI-Pregunta: ¿Hay un equivalente a la palabra clave "es" C o tengo que usar la reflexión?
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
Si intento el "equivalente" C++/CLI:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
me sale un error del compilador C2682 de error": no se puede utilizar 'dynamic_cast' convertir de 'System :: Object ^' a 'T' ".
La única cosa que puedo pensar es utilizar la reflexión:
if (T::typeid->IsAssignableFrom(obj->GetType()))
¿Existe una manera más sencilla de hacer esto?
Quizás ha malentendido mi pregunta. Sé que ese artículo de MSDN. Lo mencioné en mi pregunta. Y expliqué por qué no funciona para mí. dynamic_cast no es equivalente a C# "as". Solo funciona para tipos de referencia. – Niki
Vaya, debería leer las preguntas con más cuidado. Sí funciona para tipos genéricos, pero no para tipos de valores. –
C# 's 'as' tampoco funciona para los tipos de valores:' dynamic_cast' es el equivalente exacto de 'as'. Use 'safe_cast' para convertir a tipos de valores. La semántica es equivalente a la de C#: lanza una excepción para los tipos erróneos para los tipos de valor, devuelve 'null' para los modelos erróneos a los tipos de referencia. –