Определитесь, вызывающая сторона будет знать на этапе компиляции объект какого типа ей нужно получить?
Если будет, то сделайте переключающий параметр параметром шаблона, как предлагал
.
Если не будет, то можно сделать чтобы типы A и B реализовывали общий интерфейс I. В интерфейсе описать все методы, которые вызывающая сторона требует от этих типов.
И возвращать из функции указатель на I.
Типа
class I {
// interface
// ...
virtual ~I() {}
};
class A: public I { ... }
class B: public I { ... }
I* foo(const int sw) {
return sw == 0 ? new A(...) : new B(...);
}
Разумеется можно возвращать не сырой указатель, а unique_ptr