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.
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.
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.
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 ...
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:
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.