Frage zu odeint



  • Ich lerne gerade noch den Umgang mit Templates und bei odeint ist mir etwas aufgefallen:

    #include <iostream>
    #include <array>
    #include <boost/numeric/odeint.hpp>
    
    using namespace std;
    using namespace boost::numeric::odeint;
    
    const double sigma = 10.0;
    const double R = 28.0;
    const double b = 8.0 / 3.0;
    
    typedef std::array< double , 3 > state_type;
    
    void lorenz( const state_type &x , state_type &dxdt , double t )
    {
          dxdt[0] = sigma * ( x[1] - x[0] );
              dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
                  dxdt[2] = -b * x[2] + x[0] * x[1];
    }
    
    void write_lorenz( const state_type &x , const double t )
    {
          cout << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << endl;
    }
    
    int main(int argc, char **argv)
    {
          state_type x = { 10.0 , 1.0 , 1.0 }; // initial conditions
    
          integrate( lorenz , x , 0.0 , 25.0 , 0.1 , write_lorenz );
    }
    

    Die FUnkltion integrate kann ohne Verwenung von spitzen Klammern aufgerufen werden.
    Die Funktionsdefinition ist aber:

    template< class System , class State , class Time , class Observer >
    typename boost::enable_if< typename has_value_type<State>::type , size_t >::type
    integrate( System system , State &start_state , Time start_time , Time end_time , Time dt , Observer observer )
    {
        typedef controlled_runge_kutta< runge_kutta_dopri5< State , typename State::value_type , State , Time > > stepper_type;
        return integrate_adaptive( stepper_type() , system , start_state , start_time , end_time , dt , observer );
    }
    

    Wie funktioniert das, dass im Beispiel keine Template-Parameter angegeben werden?



  • Oder generell: Unter welchen Umständen fuinktioniert das?

    Ich bin total verwirrt, weil das auch geht:

    #include <iostream>
    
    template <typename T>
    void print(T item)
    {
      std::cout << item << std::endl;
    }
    
    int main()
    {
    
      print("HEllo World");
    
      return 0;
    }
    



Log in to reply