2009-12-26 8 views
15

Ich arbeite mit etwas C++/CLI-Code (neue Syntax) und versuche, einen generischen Typ zu deklarieren und eine Mitgliedsvariable auf den Standardwert zu setzen.Was entspricht C++/CLI dem Standard von C# (T)?

In C#:

class Class<T> 
{ 
    T member = default(T); 
} 

Was ist das Äquivalent in CLI?

generic<typename T> public ref class Class 
{ 
public: 
    Class() : member(default(T)) // <-- no worky 
    { 
    }  
private: 
     T member; 
}; 

Antwort

11

Interessanterweise sieht die Syntax so aus: T(). Es erfordert das Hinzufügen eines Kopierkonstruktors.

generic<typename T> 
    public ref class Class 
{ 
public: 
    Class() : member(T()) 
    { 
    } 

    Class(Class^ c) 
    { 
     member = c->member; 
    } 

private: 
    T member; 
}; 

bearbeiten DOH Auch dies funktioniert (been in Land C# so lange habe ich vergessen, dass NULL und 0 sind die gleiche Sache in C++, daher keine Notwendigkeit für die anderen Wert und Referenztyp Standardwerte) :

generic<typename T> 
    public ref class Class 
{ 
public: 
    Class() : member(0) 
    { 
    } 

    Class(Class^ c) 
    { 
     member = c->member; 
    } 

private: 
    T member; 
}; 
+2

Sie haben Recht mit T() und etwa 0 ist eine gültige Null-Zeiger-Konstante, aber 'member (0)' ist nicht immer richtig: es erfordert T hat einen ctor, der ein int dauert. –

+0

Klasse c = gcnew Klasse (); kompiliert einfach gut. Erfordert der Templat-Typ diesen Konstruktor (als Object hat er keinen) oder ist in diesem Fall der Zeiger des verwalteten Handle-Zeigers auf diesen Konstruktor angewiesen? – dkackman

+0

'nullptr' ist das C++/CLI-Äquivalent von C# 'null'. '0' oder 'NULL' ist kein verwalteter Zeigertyp. –

1

Aber ist das private Mitglied nicht bereits mit dem Standardkonstruktor initialisiert?

+0

Ist es? Es ist meine Erinnerung, dass C++ Membervariablen nicht initialisiert. Wie C++ mit einer Runtime und einem verwalteten Heap Speicher initialisiert habe ich keine Ahnung. – dkackman

+2

In C++ werden Membervariablen mit ihrem Standardkonstruktor initialisiert. Sie könnten denken, dass Ints nicht auf Null oder etwas initialisiert werden ... das stimmt natürlich. Aber Typen, die Konstruktoren haben, rufen ihre Standardkonstruktoren auf. –

+0

Ein guter Punkt, aber da mein Typparameter ein Werttyp oder ein Referenztyp sein kann, kann ich ihn nicht initialisieren. Der Grund für die Variation des Grundes (T) ist Teil von C#. Ich habe nur ein CLI-Äquivalent erwartet. – dkackman

Verwandte Themen