std::sin und auto?
-
Hallo,
ich hab ein Problem welches ich gerade nicht wirklich nachvollziehen kann. Und zwar ergibt bei mir:
#include <iostream> #include <cmath> #include <complex> int main() { auto sin_func = std::sin<double>; std::cout << sin_func(1.0) << '\n'; // Output: (0.841471,0) }
Das ist aber nicht das was ich will bzw. erwartet hätte, schließlich will ich einfach eine sinus funktion die ein
double
nimmt und eindouble
zurückgibt. Statt dessen erhalte ich eine Sinus Funktion die einstd::complex<double>
nimmt und ein eben solches zurückgibt!Wie kommt das bzw. wie soll man das sonst machen?
-
Nun, das Problem ist, dass es folgende Deklarationen von std::sin gibt:
float sin( float arg ); double sin( double arg ); long double sin( long double arg ); double sin( Integral arg ); // idR ein Template, was via enable_if, dafür sorgt, dass nur Integer Typen angenommen werden template< class T > complex<T> sin( const complex<T>& z );
Wenn du nun std::sin<double> schreibst, sucht der Compiler eine Templatefunktion, wo man ein double reinstecken kann. Die einzige, die in Frage kommt, ist die complex. Die anderen sind keine Templates.
Du musst also casten:auto fnc = static_cast<double(*)(double)>(std::sin);
-
double (*fnc)(double) = std::sin;
-
Ok, das macht Sinn, vielen Dank
Wobei sich mir der Sinn einer template sinus-Funktion die nur integer Werte annehmen kann irgendwie nicht erschließt