Wie kann die Array-Größe aus einem Enum-Template-Argument abgeleitet werden?

8

Wie soll ich den Code unten ändern, so dass Array<Index> array; genug ist und die SIZE automatisch aus der enum abgeleitet wird?
Selbst wenn sich die Enumeration ändert, ist garantiert, dass% ce_de% auf die richtige Größe verweist.

%Vor%

UPDATE: "Array & lt; type & gt; bedeutet, dass Sie ein Array von Type-Objekten erstellen" (Jerry) und "der Name der Klassenvorlage ist ein bisschen irreführend" (Nawaz): eigentlich Ich erstelle CustomSqlQueryModel & lt; TableColumns & gt ;. Das obige ist nur ein vereinfachter Code, mehr nicht. Jerry und Nawaz sind recht: Dieser vereinfachte Code ist bedauerlich.

    
Ali 15.02.2011, 00:10
quelle

3 Antworten

6

Sie können eine Merkmalsklasse schreiben. Dies erfordert jedes Mal, wenn Sie einen neuen Enum-Typ definieren, etwas zusätzliche Arbeit, aber keine zusätzliche Arbeit für jedes Vorkommen von Array & lt; Index & gt; im Benutzercode:

%Vor%

Einer der Vorteile davon ist, dass Sie die Eigenschaften für externe Enums, die Sie nicht kontrollieren, spezialisieren können, solange Sie wissen, wie Sie die maximale Größe erhalten.

    
Fred Nurk 15.02.2011, 00:39
quelle
1

Wie gesagt, ich glaube nicht, dass Sie es können. Wenn Sie es jedoch in etwas wie:

ändern %Vor%

Dann könnte Ihre Vorlage etwa so aussehen:

%Vor%

... und wenn der Typ, den Sie als Enum übergeben, keine positive Konstante namens SIZE enthält, wird die Instanziierung nicht kompiliert. Für den vorliegenden Zweck würden Sie wirklich bevorzugen, dass Index ein Namespace ist, aber da ein Namespace kein Typ ist, glaube ich nicht, dass Sie ihn als Template-Argument verwenden können.

Ich sollte jedoch hinzufügen, dass ich mir nicht sicher bin, ob mir diese Idee überhaupt gefällt - die meisten Leute werden denken, Array<type> bedeutet, dass Sie ein Array von Type -Objekten erstellen, und das ist eindeutig etwas ganz anders als das ...

    
Jerry Coffin 15.02.2011 00:22
quelle
0

Wenn Sie nur die Größe als Vorlagenargument verwenden möchten, nicht den -Typ , wie in Ihrem Beispiel, scheint der -Typ der Array wäre immer int , warum implementierst du das dann nicht:

%Vor%

Beachten Sie diesen Zusatz: Es ist besser, wenn Sie auch die const-Version von operator[] implementieren, damit const Array<> sie für den Zugriff auf die Array-Elemente verwenden kann, andernfalls würde Ihre Klasse nicht für const Array<> funktionieren.

    
Nawaz 15.02.2011 01:47
quelle

Tags und Links