Funktionsspezialisierung in der Template-Klasse für Float- und Double-Literale

9

Ich versuche eine Lösung zu finden, um konstante numerische Literale innerhalb der Template-Klassenmethode zu haben. Ich mache einige Mathe-Vorlagen-Klassen, die mit Float- oder Double-Typen verwendet werden können. Das Problem besteht darin, dass Literale je nach Datentyp unterschiedlich sind (z. B. "0.5f" für Float und "0.5" für Double). Bisher habe ich zwei Lösungen gefunden. Ein hypothetischer Code für den ersten:

%Vor%

Der obige Ansatz erzwingt das Umschreiben ganzer Methoden für jeden Typ, mit dem es verwendet wird.

Ein anderer Ansatz:

%Vor%

Dies erfordert nicht mehrere Methoden für einen bestimmten Typ zu schreiben, sondern erfordert eine Menge getValue () - Methoden für jede "magische Zahl", die innerhalb der Methode verwendet werden muss.

Gibt es einen anderen, "eleganteren" Weg, dies zu lösen?

    
umebe 18.06.2012, 17:34
quelle

3 Antworten

1

Vielen Dank für Ihre Antworten und Kommentare. Ich habe mir erlaubt, eine Zusammenfassung dessen zu geben, was bisher gesagt wurde, und füge meine Schlussfolgerungen hinzu.

Ich werde eine mathematische Klassenvorlage implementieren, die instanziiert werden soll, um sie mit float oder double zu verwenden. Es ist erforderlich, einige numerische Literale intern in der Klasse zu verwenden. Sie werden einige häufig verwendete numerische Literale und Konstanten wie 0.0, 0.5, 1.0, pi, etc. sein. Ich suche nach einer Lösung, um die Klasseninstanziierung an verschiedenen Literalen abhängig von ihrem Typ arbeiten zu lassen.

Ob float- und double-Literale verwendet werden oder nicht

Diskussion ging ein wenig über das Thema, ob oder nicht die Mühe, separate Literale für float und double zu verwenden. Dies könnte durch ein bisschen unglückliches Beispiel verursacht werden, das ich in meiner Frage gegeben habe. Im Beispiel wird das Literal sowieso zur Kompilierzeit in den richtigen Typ konvertiert, so dass kein Schaden entsteht. Aber im Allgemeinen wird es Fälle geben, in denen Literale im Ausdruck verwendet werden müssen, zum Beispiel:

%Vor%

Dies zwingt Compiler, x in double zu konvertieren, Berechnungen durchzuführen und das Ergebnis wieder in float umzuwandeln. Vor- und Nachteile eines solchen Verhaltens:

Pros:

  • Genauigkeitsgewinn, weil die tatsächlichen Berechnungen doppelt ausgeführt werden Präzision.

Nachteile:

  • Wenn die Leistung ein Problem darstellt, kann dies zu schnellerem Ergebnis führen langsamere Ausführung, abhängig von Umgebung und Plattform. Dies führt je nach Implementierung einige Leistungsänderungen ein, die ist soweit ich betrachte, schlecht.
  • Führt zu Inkonsistenzen bei der Berechnung, da einige Operationen ausgeführt werden gemacht auf Floats und einige auf Doubles, je nach Literalverwendung. Dies könnte auch einige Bugs Exposition öffnen.
  • Es bricht die Idee, Klasse für Floats überhaupt zu spezialisieren weil interne Berechnungen sowieso auf doubles durchgeführt werden.

Zusammenfassend besteht das Ziel darin, die Klasseninstanziierung an geeigneten Typen ohne zusätzliche Konvertierungen vorzunehmen. Die Idee, doppelte Literale überall zu verwenden, wie zum Beispiel 0.5 und die korrekte Umwandlung in den Compiler zu belassen, ist keine Option.

Mehr zum Thema: Sollten wir Float-Literale für Floats anstelle der einfacheren doppelten Literale verwenden?

>

Mögliche Lösungen?

  • Spezialisieren Sie Methoden für jeden Template-Instantiierungstyp where Literale müssen verwendet werden. Dies ist wahrscheinlich die schlechteste Lösung, weil es Zwingt den gleichen Code zweimal mit geringfügigen Änderungen zu schreiben Literale.
  • Machen Sie spezielle getValue<type>() Methoden oder als Jonathan Wakely gepostet - spezialisiert Mitglieder. Dies könnte dazu führen, dass einige dumme benannte Mitglieder oder Methoden verwendet werden in der Klasse wie getZeroPointFive<float>() .
  • Mohammad und Tony Delroy haben darauf hingewiesen, dass jedes Literal damit umhüllt wird static_cast<T>() wird den Trick machen. Umwandlung in den richtigen Typ wird zur Kompilierzeit durchgeführt werden.
umebe 19.06.2012 18:40
quelle
0

Angenommen, es ist tatsächlich notwendig, verschiedene Werte in den beiden Spezialisierungen zu verwenden (es ist nicht notwendig für 0.5 und 0.5f, zum Beispiel), es wäre viel weniger tippen zu tun:

%Vor%     
Jonathan Wakely 18.06.2012 17:53
quelle
0

Sie müssen sich nur keine Gedanken darüber machen - verwenden Sie 0,5 und wenn der Typ float ist, initialisiert der Compiler ihn immer noch optimal auf den gleichen Wert wie wenn Sie 0.5f benutzt hätten.

Es ist ein bisschen langatmig, aber Sie sollten vielleicht die "anderen Mechanismen, die den Polymorphismus unterstützen" Teil meiner Antwort hier lesen: Polymorphismus in C ++

Für eine allgemeinere Verwendung der float-Konstante in der gesamten Funktion - insbesondere in Vergleichen und Ausdrücken - lohnt es sich, den Link bluemess lentions zu lesen ....

    
Tony Delroy 18.06.2012 17:51
quelle