Byłem pod wrażeniem, aby zobaczyć ostatni przykład w Todd Veldhuizen's metaprogramming guide, gdzie funkcje trig jak sin
i cos
są wstępnie obliczane w czasie kompilacji. Szczerze powiedziawszy to mnie odstraszyło i jeśli piszesz kod, który wykonuje ogromną liczbę tych w pętlach, tak jak ja, to może to mieć istotny wpływ na zwiększenie wydajności.Jakie operatory matematyczne są dostępne w metaprogramowaniu
Pytanie 1
Jednak to doprowadziło mnie do zastanawiać, gdzie linia jest rysowana między tym, co jest dostępne jako narzędzie run-time (wywołanie rzeczywistych funkcji bibliotecznych matematyka jak sin
lub cos
) i to, co jest dostępne tylko operator matematyki w czasie kompilacji.
Przykład Todda wymaga ręcznego obliczenia funkcji wyzwalania za pomocą zwykłej arytmetyki.
jestem założyć następnie, że kompilator jest w stanie wszystkich zwykłych funkcji matematycznych *
+
-
/
ale nic innego?
Pytanie 2
W takim przypadku, można by tylko być w stanie uzyskać wyniki kompilacji dla sin
i cos
obliczeń na liczbach całkowitych, prawda? Oznacza to, że nie można wstępnie skompilować wyniku czegoś podobnego do sin 45.5
, prawda?
Albo jeśli szablon może przyjąć jedynie liczb całkowitych jako parametrów, można podjąć kilka liczb całkowitych i zrobić float
z nich w klasie, jak przepływające 1
2
3
i podejmowania 1.23
uzyskać sin
o wartości typu float.
Do obliczania sinusa w czasie kompilacji z ekspansją szeregową patrz http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html – jmihalicza