Frage

Ich habe eine Templat-Klasse

template <typename Data>
class C
{
.....
}

In den meisten Fällen hängt ich auf dem Compiler mich Typen für Daten ersetzen zu lassen. Ich nenne Methoden foo (), goo () auf Objekte vom Typ Daten, also was ich Bedürfnisse Ersatz zu schaffen Das.

Ich brauche jetzt Ersatz int und String für meinen Datentyp. Ich möchte nicht, sich spezialisieren weil die Klasse ist bereits zu groß und würde jede Methode spezialisiert (mit nur geringen Code ändern) erfordern.

Meine Optionen (Bitte sagen Sie mir, wenn es mehr)

1) I-Wrapper-Klassen um int zur Verfügung stellen kann und Zeichenfolge, die die Methoden foo (), goo () etc

implementieren

2) eine Klasse Züge Merkmale, die Anrufe foo () oder Schmiere () auf Objekte von Klassen, die foo (), goo () liefern (Diese sind meine jetzigen substituierbar Klassen) und spezialisieren sich diese Klassen für int und String.

Fragen

1), was die relativen Vorteile von 1 vs 2 sind?

2) Meine Züge Klassen werden statische Methoden haben. Kann ein Zug Klasse nicht-statische Methoden als auch hat? Ich sehe die meisten Züge Klassen Konstanten in der STL definieren.

3) mache ich die Züge Klassen global oder soll ich gebe sie in als Template-Parameter für die Klasse C?

War es hilfreich?

Lösung

Sie könnten Teil der Klasse spezialisieren wie folgt:

template <typename Data>
class C
{
  void foo();

  // lot of other stuff
};

// specialize part of class C 
// (some members of a class C will have specific 
//  implementation for specific types)
template<> void C<int>::foo() { std::cout << "int" << std::endl; }
template<> void C<std::string>::foo() { std::cout << "string" << std::endl; }
// same for goo

Die Syntax oben erlaubt von C ++ Standard-14,7 / 3 und 14.5.2 / 2. Es gibt keine Notwendigkeit, alle Sachen aus der Klasse C mehrmals neu zu schreiben.

Beachten Sie, dass es nicht zu teilweise Template-Klasse in einer solchen Art und Weise spezialisiert ist erlaubt. Zum Beispiel können Sie nicht verschiedene Funktionen für Data und Data* Typen auf diese Weise definiert werden.

Andere Tipps

  

1), was die relativen Vorteile von 1 vs 2 sind?

Wickel um Einbauten halten C einfach. Traits halten die Einbauten Einbauten. :)
Sie könnten auch zu Faktor aus dem Code versuchen, das unterscheidet sich auf Data in einer Basisklasse Vorlage abhängig und spezialisieren.

  

2) Meine Züge Klassen werden statische Methoden haben. Kann ein Zug Klasse nicht-statische Methoden als auch hat? Ich sehe die meisten Züge Klassen Konstanten in der STL definieren.

Ich bin nicht einmal sicher, es ist immer noch „Traits“ bezeichnet, wenn es Staat hat.
FWIW, ich in der Regel als Merkmale kategorisieren nur diejenigen, die Faktor aus Information über andere Arten. Wenn es darum geht, Verhalten , würde ich es eher eine Politik nennen. Ich sehe aber, dass std::char_traits nicht diese Definitionen paßt. :( Wie auch immer, wenn sie es nicht statische Mitglieder hat, dann hat er den Zustand, und ich würde diese Züge nicht mehr nennen.

  

3) Muss ich die Züge Klassen global machen oder soll ich geben sie in als Template-Parameter für die Klasse C?

als Vorlage Parameterübergabe ist nur sinnvoll für Sie möchten, dass Benutzer von C ihre eigenen Züge liefern, was sie in so Data passieren. Wenn es eine Vorlage für Züge int kann die Klasse, dass nur sein verwendet immer je. Wenn die Benutzer mit ihren eigenen Merkmalen für int kommen könnten, müssen sie einen Weg, es zu C passieren.

Ein halbes Dutzend der einzelnen? Ich weiß nicht, irgend a priori Grund einen im Vergleich zu den andere in einem allgemeinen Sinne zu verwenden. Nichts von dem was Sie fragen, macht mich denken, dass Sie einen über den anderen wählen sollten. Das einzige, was ich denken kann, ist, dass Wahl 1 wird sich wahrscheinlich weniger Änderungen an der bestehenden Funktion (en) erfordern. Auf der anderen Seite, nicht in der Lage sein, Kunden nur, um die Funktion auf Primitive zu verwenden, ohne die Hülle zu schaffen.

Es ist wirklich eine Frage der Besonderheiten und Sie haben sie nicht liefern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top