Вы можете передать func1/2/3
в качестве параметра шаблона шаблона и переадресовать вызов на него.
typename <template <typename> typename Func, typename... Params>
auto switchFunction(Type type, Params&&... params) {
switch (type)
{
case Type::typeA: return Func<Type::typeA>(std::forward<Params>(params)...);
case Type::typeB: return Func<Type::typeB>(std::forward<Params>(params)...);
case Type::typeC: return Func<Type::typeC>(std::forward<Params>(params)...);
...
}
}
Затем вы будете использовать это как
auto someOtherFunc(Type type, int param1, double param2)
{
return switchFunction<func1>(type, param1, param2);
}
Чтобы это работало, все версии func1
должны возвращать один и тот же тип.
Кроме того, все вызовы на func1
должны быть действительными. Не только тот, который выбран переключателем.