以下のコードでは、メンバー関数を汎用ルートファインダーに渡す方法を理解できません。
#include <stdio.h>
double OneDimBisector(double (*fun)(float), float a, float b, float tol){
double val;
val = (*fun)(0.5*(b-a)); // actually: do proper bisection
return val;
}
class EOS {
public:
double S_array[10][10]; // actually: filled by constructor
double S(double T, double P);
double T_PS(double P, double S);
double functForT_PS(double T);
double (EOS::*pfunctForT_PS)(double);
double Sseek, Pseek;
};
double EOS::S(double T, double P){
double val = T+P; // actually: interpolate in S_array
return val;
}
double EOS::functForT_PS(double T){
return S(T,Pseek)-Sseek;
}
// Find T from P and S (T is invertible), assuming the intervals are ok
double EOS::T_PS(double P, double S0){
double Tmin = 2., Tmax = 7., T1, tol=1e-8;
pfunctForT_PS = &EOS::functForT_PS;
Sseek = S0;
Pseek = P;
printf("\n %f\n", (*this.*pfunctForT_PS)(4.)); // no problem
T1 = OneDimBisector(pfunctForT_PS, Tmin, Tmax, tol); // wrong type for pfunctForT_PS
return T1;
}
int main() {
double P=3., S=8;
EOS myEOS;
printf("\n %f %f %f\n",P,S,myEOS.T_PS(P,S));
}
ルートファインダーはこのクラスに固有のものではないため、メンバーにしたくありません。すべてを作成するソリューションはstatic
非常にエレガントではないようです。誰かがアイデアを持っていますか?これはよくある状況ですが、私にも理解できる関連する投稿は見つかりませんでした。
ありがとう!
編集:Pseek
実際、私はまた尋ねることを意味しました:私がしたこと以外に変数を設定する適切でスレッドセーフな方法はありますか?明確にするために、私は2次元関数で1次元の求根アルゴリズムを実行していますが、2つの引数の1つを修正しています。