의 템플릿 래퍼 나는 현재 미분 방정식을 해결하기 위해 내 수업 내부 gsl_odeiv2 방법을 사용하고 있습니다. 그러나 잘 알려진 memberfunction 문제로 인해 클래스 내 내 ode-system을 정의 할 수 없습니다. 나는 글로벌 네임 스페이스 내 송시를 정의 :gsl_odeiv2 : INT (...) ODE
ODE.hpp:
#include "EoS.hpp"
#include <gsl/gsl_math.h>
#include <gsl/gsl_errno.h>
namespace ODEs
{
struct tov_eq_params {EoS *eos;};
int tov_eq(double, const double *, double *, void *);
}
ODE.cpp:
namespace ODEs {
int tov_eq(double r, const double *PM, double *dPdM, void *p) {
struct tov_eq_params * params = (struct tov_eq_params *)p;
EoS *eos = (params->eos);
...
return GSL_SUCCESS
}
}
및 매개 변수로 coustom 유형 (클래스 EOS)의 객체에 대한 포인터를 사용 나는 현재 해결 방법을 사용하고 있습니다. 제가 사용하는 유치원을 해결하는 수업에서는 다음을 사용합니다 :
...
struct tov_eq_params comp_tov_params = {(this->star_eos)};
gsl_odeiv2_evolve *comp_tov_evolve = gsl_odeiv2_evolve_alloc(3);
gsl_odeiv2_system comp_tov_system = {tov_eq, NULL, 3,&comp_tov_params};
...
내 시스템을 활성화하십시오. 이것은 잘 동작하지만 전역 네임 스페이스에서 미분 방정식을 선언해야하기 때문에 약간 지저분합니다.
가 나는 C++ 클래스에서 사용하는 gsl_functions stackoverflow.com/questions/.../how-to-avoid-static-member-function-when-using-gsl-with-c/...에 대한 템플릿 래퍼를 사용하는 것이 가능하다는 것을 알고있다. 나는 실제로 클래스 내에서 gsl_integration 메소드에 대한 함수를 정의하기 위해 거기에 설명 된 래퍼를 사용하며 완벽하게 작동하며 작성하기가 훨씬 깨끗하고 코드가 적습니다. 예를 들어 : 내 star_eos가 함수 내에서 위의 direcly에서 객체 사용할 수 있습니다 : 나는 INT (더블 R, const를 두 번 *의 PM에 대한 이러한 템플릿 래퍼를 작성하는 노력
auto dBf = [=](double r)->double{
return 4 * M_PI * gsl_pow_2(r) * (this->star_eos)->nbar(this->P(r)) * sqrt(this->expLambda(r))* 1e54;
};
gsl_function_pp<decltype(dBf)> dBfp(dBf);
gsl_function *dB = static_cast<gsl_function*>(&dBfp);
더블 * dPdM, 무효 * P) 함수는 gsl_odeiv2_system이 필요하지만 C++을 처음 사용하고 템플릿/static_cast 메커니즘을 완전히 이해하지 못해 실패했습니다.
템플릿 래퍼 gsl_odeiv 방법과는 ODE 시스템을 사용하는 사람이 있습니까? 또는 gsl_functions에 대해 위에서 설명한 것과 비슷한 템플리트를 만들 수도 있지만 int (...) ode에 대해 만들 수 있습니까?