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 ein double zurückgibt. Statt dessen erhalte ich eine Sinus Funktion die ein std::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);
    

  • Mod

    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 😃


Anmelden zum Antworten