C ++ - Merkmalfrage

8

Ich habe eine Template-Klasse

%Vor%

In den meisten Situationen bin ich auf den Compiler angewiesen, um die Typen für Data zu ersetzen. Ich rufe die Methoden foo (), goo () für Objekte vom Typ Data auf, also muss ich was ersetzen Das.

Ich muss jetzt Int und String für meinen Datentyp ersetzen. Ich möchte mich nicht spezialisieren weil die Klasse schon zu groß ist und man jede Methode spezialisieren müsste (mit nur kleinen Codeänderungen).

Meine Optionen (bitte sagen Sie mir, wenn es mehr gibt)

1) Ich kann Wrapper-Klassen um int und string bereitstellen, die die Methoden foo (), goo () usw. implementieren.

2) bieten eine Merkmalsklasse Eigenschaften, die foo () oder goo () für Objekte von Klassen aufrufen, die foo (), goo () bereitstellen (Dies sind meine gegenwärtigen substituierbaren Klassen) und spezialisieren diese Klassen für int und string.

Fragen

1) Was sind die relativen Vorteile von 1 vs 2?

2) Meine Charakterklassen haben statische Methoden. Kann eine Traits-Klasse auch nicht-statische Methoden haben? Ich sehe die meisten Merkmale Klassen definieren Konstanten in der STL.

3) Mache ich die Merkmalsklassen global oder übergebe ich sie als Vorlageparameter für Klasse C?

    
duli 10.06.2010, 20:13
quelle

3 Antworten

7

Sie könnten einen Teil der Klasse wie folgt spezialisieren:

%Vor%

Die Syntax, die oben in C ++ Standard 14.7 / 3 und 14.5.2 / 2 erlaubt ist. Es ist nicht nötig, alle Sachen aus der Klasse C mehrmals neu zu schreiben.

Beachten Sie, dass es nicht erlaubt ist, die Vorlagenklasse auf diese Weise teilweise zu spezialisieren. Zum Beispiel können Sie auf diese Weise keine unterschiedlichen Funktionen für die Typen Data und Data* definieren.

    
Kirill V. Lyadvinsky 10.06.2010, 20:22
quelle
2
  

1) Was sind die relativen Vorteile von 1 vs 2?

Wrapper um eingebaute Elemente halten C einfach. Eigenschaften behalten die eingebauten Einbauten. :)
Sie könnten auch versuchen, den Code, der sich in Abhängigkeit von Data unterscheidet, in eine Basisklassenvorlage zu zerlegen und diese zu spezialisieren.

  

2) Meine Charakterklassen haben statische Methoden. Kann eine Traits-Klasse auch nicht-statische Methoden haben? Ich sehe die meisten Merkmale Klassen definieren Konstanten in der STL.

Ich bin nicht einmal sicher, ob es noch "Merkmale" heißt, wenn es einen Zustand hat.
FWIW, ich kategorisiere normalerweise nur solche Eigenschaften, die Informationen über andere Typen ausschließen. Wenn es um Verhalten geht, würde ich es eher als Richtlinie bezeichnen. Ich sehe jedoch, dass std::char_traits nicht zu diesen Definitionen passt. %Code% Wie auch immer, wenn es nicht-statische Mitglieder hat, dann hat es einen Zustand, und ich würde diese Eigenschaften nicht mehr nennen.

  

3) Mache ich die Merkmalsklassen global oder sollte ich sie als Vorlageparameter für Klasse C übergeben?

Wenn Sie es als Template-Parameter übergeben, macht das nur Sinn, wenn Benutzer von :( ihre eigenen Eigenschaften für alles, was sie übergeben, als C angeben. Wenn es immer eine Merkmalvorlage für Data geben wird, kann die Klasse diese verwenden. Wenn Benutzer ihre eigenen Merkmale für int erstellen, benötigen sie eine Möglichkeit, sie an int zu übergeben.

    
sbi 10.06.2010 20:16
quelle
0

Ein halbes Dutzend von jedem? Ich kenne keinen a priori Grund, einen gegen den anderen in einem generischen Sinn zu verwenden. Nichts von dem, was du fragst, lässt mich denken, dass du eins über das andere wählen solltest. Das einzige, was mir einfällt, ist, dass Auswahl 1 wahrscheinlich weniger Änderungen an den vorhandenen Funktionen erfordert. Auf der anderen Seite können Clients die Funktion für Primitive nicht verwenden, ohne den Wrapper zu erstellen.

Es ist wirklich eine Frage von Einzelheiten und du hast sie nicht zur Verfügung gestellt.

    
Crazy Eddie 10.06.2010 20:18
quelle

Tags und Links