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?
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:
Nachteile:
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?
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>()
. static_cast<T>()
wird den Trick machen. Umwandlung in den richtigen Typ wird
zur Kompilierzeit durchgeführt werden. 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%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 ....
Tags und Links c++ function templates specialization literals