Ho letto da qualche parte su MSDN che l'equivalente alla parola chiave "is" di C# sarebbe dynamic_cast, ma non è realmente equivalente: non funziona con i tipi di valore o con parametri generici. Per esempio in C# posso scrivere:C++/CLI-Domanda: Esiste un equivalente alla parola chiave C# "è" o devo usare la riflessione?
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
Se provo il "equivalente" C++/CLI:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
ottengo un errore del compilatore "C2682 di errore: non può usare 'dynamic_cast' convertire da 'Sistema :: Oggetto ^' in 'T' ".
L'unica cosa che mi viene in mente è quello di utilizzare la riflessione:
if (T::typeid->IsAssignableFrom(obj->GetType()))
C'è un modo più semplice per fare questo?
Forse hai frainteso la mia domanda. So che l'articolo MSDN. L'ho menzionato nella mia domanda. E ho spiegato perché non funziona per me. dynamic_cast non è equivalente a C# "come". Funziona solo per i tipi di riferimento. – Niki
Oops, dovrebbe leggere le domande più attentamente. Funziona per tipi generici, ma non per tipi di valore. –
'' as' di C# non funziona per i tipi di valore: 'dynamic_cast' è l'equivalente esatto di' as'. Usa 'safe_cast' per eseguire il casting sui tipi di valore. Le semantiche sono equivalenti a quelle di C#: lancia un'eccezione per i cast errati ai tipi di valore, restituisce 'null' per i tipi di riferimento errati. –