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; }
-