Warum darf man Fließkommazahlen nicht als Templateargument verwenden?
-
Hi,
warum darf man Fließkommazahlen wie float eigentlich nicht
als Templateargumente verwenden?
Gibt es einen Grund, oder ist es einfach so beschlossen wordn und noch
nicht geändert worden. Gibt es eventuell ein Workaround dafür?
-
Elisaa schrieb:
Gibt es eventuell ein Workaround dafür?
Ja, mach es einfach
int main(int argc, char**argv) { std::vector<float> gehtDoch; }
-
Ist einfach beschlossen worden. Steht aber afaik immer wieder mal zur Debatte, dass mans ändern könnte. Da templates als Argumente nur Compile-time-konstanten akzeptieren, fällt mir im Moment kein guter Workaround ein.
-
Sorry, habe Frage falsch gestellt.
Ich meine folgendes:
template< class T, T arg > class Foo { }; Foo< float, 14 > a;
-
Der Grund liegt primär darin, dass der Standard bzgl. der Ausführung von Gleitkommaarithmetik keine besonders strengen Vorgaben macht. Problematisch ist das vor allem beim Crosscompilieren ein Problem. Das Ergebnis eines Ausdrucks muss ja das gleiche sein, unabhängig davon, ob die Berechnung bereits beim Compilieren oder erst während der Laufzeit durchgeführt wird. Nun können wir es z.B. im Embedded-Bereich gelegentlich mit ICs zu tun, die Gleitkommaoperationen nicht direkt ausführen können und auf Bibliotheksunterstützung angewiesen sind. Je nach Anwendung kann es dabei akzeptabel sein, wenn diese Bibliothek nun Berechnungen nicht IEEE754-kompatibel durchführt (weil es so ggf. schneller ist). Unser Crosscompiler müsste nun das Verhalten dieser Bibliothek bereits beim Compilieren emulieren (das Verhalten des front-ends hängt vom back-end ab). Das das ein Problem ist, dürfte offensichtlich sein. Integerarithmetik ist im Vergleich unproblematisch, da diese sich grundsätzlich der Binärdarstellung bedienen muss.