Сделать заводскую функцию:
template<class Derived>
Base* instantiate(A arg1, B arg2, C arg3) {
return new Derived(arg1, arg2, arg3);
}
Создайте карту, используя тип ключа, который имеет смысл:
std::map<int, Base(*)(A, B, C)> factory;
factory[0] = instantiate<Class1>;
factory[1] = instantiate<Class2>;
factory[2] = instantiate<Class3>;
Да, для int
это может быть просто массив или std::vector
, но я использую std::map
выше, чтобы предложить общее решение. Затем вы можете получить экземпляры с завода очевидным способом. Для произвольных условий это должно быть что-то вроде этого:
int index = cond1 ? 0
: cond2 ? 1
: cond3 ? 2
: throw std::runtime_error("Invalid index.");
return factory[index](arg1, arg2, arg3);
Но, возможно, есть более разумный способ сделать это, исходя из специфики вашей проблемы.