Я пытался узнать больше об универсальном программировании, так как мне кажется, что я недостаточно разбираюсь в этом. Итак, я думаю о том, как реализовать шаблонную версию одной из моих программ. Программа, с которой я пытаюсь это сделать, представляет собой программу числового интегратора, в которой пользователь выбирает, какой интегратор использовать (т. е. Эйлера, Рунге-Кутта и т. д.), а затем интегрирует любую функцию по своему выбору. Мой текущий метод сделать это состоит в том, чтобы иметь абстрактный базовый класс 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);
}
}
Так что этот метод отлично работает, и программа-интегратор работает очень хорошо. Теперь я знаю, что шаблонные функции генерируются во время компиляции, и учитывая, что я использую информацию времени выполнения, как бы вы реализовали это с помощью шаблонов? Если вопрос не ясен, я спрашиваю... Учитывая выбор пользователя во время выполнения, то есть какой интегратор использовать, как мне вызвать правильную функцию интеграции, используя метод шаблона?