我一直在尝试更多地了解泛型编程,因为我认为我对此了解的不够多。所以我正在考虑如何实现我的一个程序的模板版本。我尝试使用的程序是一个数值积分器程序,用户在其中选择要使用的积分器(即 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);
}
}
所以这个方法效果很好,积分器程序运行的很好。现在我知道模板函数是在编译时生成的,并且考虑到我正在使用运行时信息,你将如何使用模板来实现它?如果问题不清楚,我要问的是......在运行时给定用户选择,即使用哪个积分器,我如何使用模板方法调用正确的积分函数?