В C++ 11 вы можете использовать простую функцию лямбда оберточной вызов на метод члена
Class c;
auto f = [&c](const state_type & x , state_type &dxdt , double t) {
c.system_func(x , dxdt , t); };
integrate(f , x0 , t0 , t1 , dt);
std::bind
может также работать, но тогда вы должны позаботиться, если значения передаются по ссылке из по стоимость.
В C++ 03 вы должны написать простую обертку вокруг вашего метода класса
struct wrapper
{
Class &c;
wrapper(Class &c_) : c(c_) { }
template< typename State , typename Time >
void operator()(State const &x , State &dxdt , Time t) const
{
c.system_func(x , dxdt , t);
}
};
// ...
integrate(wrapper(c) , x0 , t0 , t1 , dt);
(Boost.Bind не будет правильно работать с более чем двумя аргументами).
Не интеграция в основном для цикла? – crush
@crush Да, это так. Но Odeint автоматизирует этот процесс и позволяет вам позже интегрироваться с OpenMP, Cuda и Thrust, поэтому я решил использовать его. –
@crush: интеграция - это больше, чем цикл for. Я также создаю шаговый элемент и выполняет интеграцию с плотным управлением выводом и шагом. – headmyshoulder