Code-Optimierung mittels Templates (math. Funktionen)
-
Hier gibts ja,denke ich, einige Leute die sich richtig gut mit dem ganzen Template-Zeugs auskennen.
In dem buch "Game Programming Gems 1" gibts einen Artikel der beschreibt wie man einige Mathem. Funktionen mittels Templates schon zur Compile-Zeit vorberechnen kann. Das wollte ich bei mir jetzt auch irgendwie reinbringen, allerdings hakts da doch etwas. Mal ein (simples) Beispiel:template<double R> struct MyFunc { static inline double f() { return R / 4.5; //Nur ein einfaches Beispiel }; }; //Makro, um leichter auf die Funktion zuzugreifen: #define MyFuncT(r) MyFunc<r>::f()Wenn ich das von außen benutzen will, z.B. so:
double a = 0; int main() { .... //a irgendwie verändern MyFuncT(a); return 0; }Dann krieg ich im Prinzip 2 Fehler. Ich benutze VC++ 2005.
Einmal sagt er mir folgendes:
'double' : illegal type for non-type template parameter 'R'
Also sprich, dass ich double in meinem Template nicht benutzen dürfte?!Und dann noch, dass das was ich dann reingebe in meiner main-Methode konstant sein muss. "a" ist hier ja keine Konstante. Heißt das dann prinzipiell, dass ich sowas nur dann benutzen kann, wenn ich stets konstante Ausdrücke benutze?
Bzw. wäre es bei meinen Formeln auch so, dass ich integer reingeben könnte in die Templates, und ich könnte zumindest den Bereich eingrenzen, d.h. ich weiß dass ich immer nur Werte im Bereich von z.B. 0-200 benutze. Aber kann ich das dem Compiler irgendwie "mitteilen", oder kann ich hier Templates generell ganz vergessen?
-
Metaprogramming funktioniert bereits zur Compilezeit - und das funktioniert nur mit Compilezeit-Konstanten und nur mit integralen Typen (Ganzzahlen - eventuell auch mit Zeigern).
-
Ok, danke. War ja eigentlich auch klar. Trotzdem schade

-
Naja, vor allem Schade dass es keine (mir bekannte) Möglichkeit gibt über irgendwelche Tricks eine automatische Auswahl zwischen einer compile-time und einer run-time Variante hinzubekommen.
Natürlich kann man den Code einfach inline schreiben und dann hoffen dass der Optimizer erkennt dass es compiler-time geht, aber das tut der halt nicht immer
