2009-06-04 2 views
2

Dans l'objet CLR .net est la base pour tous les objets de classe, mais pas les types de base (par exemple, int, float, etc.). Comment puis-je utiliser des types de base comme Object? I.e. Comme Boost.Variant?Comment puis-je implémenter des types de variantes dans le CLR/Managed C++?

E.g. comme: -

object intValue(int(27)); 
if (intValue is Int32) 
    ... 

object varArray[3]; 
varArray[0] = float(3.141593); 
varArray[1] = int(-1005); 
varArray[2] = string("String"); 
+0

Ceci est en .net 2.0. Je pense que la version 3.0 est plus dynamique, alors peut-être que c'est possible, mais je n'ai que VS2005 qui ne peut pas utiliser .net 3.0. – Nick

+0

C# 3.0 est ce que vous pensez, et ce n'est pas vraiment plus dynamique. Le mot clé "var" que vous avez vu ne crée pas de variantes, seulement des types déduits. var i = 1; fait toujours "i" un int. –

+0

@Nick: 3.0 n'est pas plus dynamique que 2.0; C# 3.0 a "var", mais ce n'est pas "variant" - c'est "variable", ce qui signifie "infer le type automatiquement". Il est encore typé statique. C# 4.0 introduit "dynamique" –

Répondre

4

object, via la boxe, est la classe de base efficace (racine) de tous les types .NET. Cela devrait fonctionner correctement - vous avez juste besoin d'utiliser is ou GetType() pour vérifier les types ...

object[] varArray = new object[3]; 
varArray[0] = 3.141593F; 
varArray[1] = -1005; 
varArray[2] = "String"; 
+0

J'utilise actuellement Managed C++ et cela ne compile pas. Je pense que tout ce qui est possible en C# devrait être possible dans MC++? – Nick

+0

Merci. Je n'avais pas la bonne syntaxe pour renvoyer une valeur encadrée dans C++ géré. – Nick

+0

Vous avez inclus C# comme balise, donc j'ai utilisé la syntaxe C# ... –

1
object varArray[3] = new object[3]; 
varArray[0] = 3.141593; 
varArray[1] = -1005; 
varArray[2] = "String"; 
3

Puisque vous avez mentionné que vous êtes en C++/CLI, vous devriez être en mesure de le faire:

array<Object^>^ varArray = gcnew array<Object^>(3); 

varArray[0] = 3.141593; 
varArray[1] = -1005; 
varARray[2] = "String"; 

double val = *reinterpret_cast<double^>(varArray[0]); 
0

Merci pour la réponse de boxe. Je dois encadrer ma valeur de retour, par ex.

Object^createFromString(String^value) 
    { 
     Int32 i(Convert::ToInt32(value)); 
     return static_cast< Object^>(i); 
    } 

Je dois encadrer la valeur de retour en transtypant sur un pointeur d'objet. Intuitif! :)

Et récupérer comme:

void writeValue(Object^value, BinaryWriter^strm) 
    { 
     Int32 i(*dynamic_cast< Int32^>(value)); 
     strm->Write(i); 
    } 
Questions connexes