В 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
.