ジェネリック プログラミングについては、十分にわかっていないと思うので、もっと学ぼうとしています。そこで、自分のプログラムの 1 つのテンプレート バージョンをどのように実装するかを考えています。私がこれを行おうとしているプログラムは、ユーザーが使用する積分器 (Euler、Runge Kutta など) を選択し、選択した関数を積分する数値積分プログラムです。これを行う私の現在の方法は、Integrator と呼ばれる抽象基本クラスと、統合メソッドを実装するいくつかの派生クラスを用意することです。したがって、コードは次のようになります (さらに多くのことが行われますが、これは方法論を示すためのものです)。これには Qt を使用し、Integrator *integrator; を宣言していることに注意してください。MainWindow クラスで。
void MainWindow::on_integrateButton_clicked() {
string whichIntegrator = getUserChoice();
integrator = getIntegrator( whichIntegrator, whichFunction, order );
integrator->setUp( data ); // things like initial conditions, time, step size, etc...
runIntegratorInNewThread();
}
基本的にファクトリメソッドを使用する getIntegrator を使用
// x being current data, xdot being the results of evaluating derivatives
typedef void (*pFunction)(const double t, const double x[], double *xdot);
Integrator* getIntegrator( const string &whichIntegrator, pFunction whichFunction, int order ) {
if (whichIntegrator == "Euler") {
return new Euler(whichFunction, order);
} else if (whichIntegrator == "RungeKutta") {
return new RungeKutta(whichFunction, order);
}
}
したがって、この方法はうまく機能し、インテグレーター プログラムは非常にうまく動作します。テンプレート関数はコンパイル時に生成されることがわかりました。実行時の情報を使用しているとしたら、テンプレートを使用してこれをどのように実装しますか? 質問が明確でない場合、私が求めているのは... 実行時にユーザーが選択した場合、どのインテグレーターを使用するか、テンプレート メソッドを使用して正しい統合関数を呼び出すにはどうすればよいですか?