выберите шаговый шаг в выражении if - PullRequest
2 голосов
/ 12 октября 2019

Я хочу выбрать схему интеграции через оператор if, подобный этому:

//stepper_type steppr; ??
if (integration_scheme == "euler") {
    [auto] stepper = euler<state_type>{};
}
else
{
    [auto] stepper = runge_kutta4<state_type>{};
}

, но шагер действителен только внутри фигурной скобки. Какой тип степпера нужно определить перед оператором if? Другой способ - передать схему интегрирования (или даже степпера) в качестве аргумента функции.

1 Ответ

1 голос
/ 12 октября 2019

В C ++ 17 и более, для этой цели мы можем применить std::variant следующим образом:

#include <variant>

class state_type {};

template<class T>
class euler {};

template<class T>
class runge_kutta4 {};

template<class T>
using stepper_t = std::variant<euler<T>, runge_kutta4<T>>;

Тогда вы можете сделать так:

DEMO

stepper_t<state_type> stepper;

if (integration_scheme == "euler") {
    stepper = euler<state_type>{};
}
else{
    stepper = runge_kutta4<state_type>{};
}

std::cout << stepper.index(); // prints 0.

Но хотя я не знаю весь код вашего проекта, я думаю, что последующий код не будет простым вышеописанным способом. Если бы я был вами, я бы определил базовые значения stepperBase и euler и runge_kutta4 как наследства stepperBase.

...