So erhalten Sie den Standardwert eines beliebigen Typs

7

In C # kann ich etwas schreiben:

%Vor%

Ich beabsichtige, ein Wörterbuch wie die Vorlagenklasse in C ++ zu schreiben. Ich möchte, dass das Diktat den Standardwert (Null) des generischen TVal-Typs zurückgibt, wenn der angegebene Schlüssel nicht gefunden wird. In C # kommt das Standardkonstrukt (T) zur Rettung, während ich in C ++ nicht sicher bin, was der richtige Weg ist, um das Gleiche zu tun.

Ich habe T obj = {} und T* obj = {} mit gcc4.7 probiert, es funktioniert gut. Ich bin nur nicht so sicher, ob es die durch die Sprachspezifikation definierte Syntax ist, ob dieser Code portable Cross-Compiler und Plattformen sein wird. Bitte hilf mir mit meiner Doudt! Vielen Dank im Voraus!

PS:

~~~~~~~~~

Um sicherzustellen, dass die Vorlage den Standardwert (null) eines beliebigen Typs erhält, sogar derjenigen, die keine aufrufbare Standard-Ctor haben, verwendete ich folgenden Mechanismus (inspiriert von avakars Antwort):

%Vor%

Es sieht hässlich aus, sollte aber keine Probleme verursachen, schließlich ist ein zero-out-Objekt nur ein Stück leerer Speicher. Liege ich falsch?

    
Need4Steed 27.09.2012, 06:41
quelle

4 Antworten

19

In C ++ gibt es in C # nichts wie default keyword. Da die Initialisierung des Standardkonstruktors vom Wert des Klassentyps fehlschlägt, ist der Standardkonstruktor private . Wenn der Standardkonstruktor in C # privat ist, wird der Wert des Klassentyps auf null initialisiert, da der Klassentyp reference-type ist.

Die Initialisierung nach {} wird durch die Sprachspezifikation definiert. Es ist C ++ 11. In C ++ 03 sollten Sie

verwenden %Vor%

Wie von bames53 im Kommentar gezeigt, sollten Sie, wenn Sie T* initialisieren möchten,

verwenden

vor C ++ 11.

%Vor%

oder

%Vor%

in C ++ 11.

%Vor%

oder

%Vor%     
ForEveR 27.09.2012, 06:43
quelle
4

Literarisch aus "Die Programmiersprache C ++, dritte Ausgabe von Bjarne Stroustrup" übernommen:

BEGIN QUOTE

4.9.5 Initialisierung [dcl.init]

Wenn für ein Objekt ein Initialisierer angegeben wird, bestimmt dieser Initialisierer den Anfangswert eines Objekts. Wenn kein Initialisierer angegeben ist, wird ein globaler (§4.9.4), ein Namespace (§8.2) oder ein lokales statisches Objekt (§7.1.2, §10.2.4) (zusammen als statische Objekte bezeichnet) auf 0 des entsprechenden Typs initialisiert . Zum Beispiel:

%Vor%

Lokale Variablen (manchmal als automatische Objekte bezeichnet) und Objekte, die im freien Speicher erstellt wurden (manchmal dynamische Objekte oder Heap-Objekte genannt), werden standardmäßig nicht initialisiert. Zum Beispiel:

%Vor%

Mitglieder von Arrays und Strukturen werden standardmäßig initialisiert oder nicht, abhängig davon, ob das Array oder die Struktur statisch ist. Bei benutzerdefinierten Typen ist möglicherweise die Standardinitialisierung definiert (§10.4.2).

Kompliziertere Objekte benötigen mehr als einen Wert als Initialisierer. Dies wird durch Initialisierungslisten behandelt, die durch {und} für die C-style-Initialisierung von Arrays (§5.2.1) und Strukturen (§5.7) begrenzt sind.

Für benutzerdefinierte Typen mit Konstruktoren werden Funktionsargumentlisten verwendet (§2.5.2, §10.2.3). Beachten Sie, dass ein leeres Klammerpaar () in einer Deklaration immer "Funktion" bedeutet (§7.1). Zum Beispiel:

%Vor%

ENDE ZITAT

Sie können also den Standardwert eines beliebigen Typs als statisches Objekt dieses Typs abrufen:

%Vor%     
roy 27.09.2012 07:03
quelle
3

Die Antwort von ForEveR funktioniert nicht, wenn T keinen Kopierkonstruktor hat. In C ++ 03 gibt es keine Möglichkeit, eine Variable, die sowohl generisch als auch elegant ist, auf Null zu initialisieren. Alles was übrig ist ist der folgende Trick.

%Vor%

Hier wird temp[0] auf Null initialisiert und dann an obj gebunden. Es werden keine Kopierkonstruktoren benötigt.

    
avakar 27.09.2012 07:13
quelle
1

Erstellen Sie Ihr eigenes Standardschlüsselwort:

%Vor%

Benutze es wie:

%Vor%

Oder mit einer leichten semantischen Variation:

%Vor%     
Martin Lütke 17.09.2013 10:26
quelle

Tags und Links