La limitación se basa en el tipo de devolución declarada de su método. El código establece:
f() {
in case one: return A;
in case two: return B;
in case three: return C;
}
Cuando en realidad el compilador requiere algo como esto:
FooType f() {
in case one: return A;
in case two: return B;
in case three: return C;
}
Debe ser posible convertir el A, B, y C a un FooType, normalmente a través de la herencia simple, aunque no entraré en las diferencias entre las subclases frente a la subtipificación.
Existen enfoques que pueden evitar esto. Puede crear una clase o estructura (C++) que tenga campos para cada tipo diferente de retorno posible y usar algún campo de indicador para indicar qué campo es el valor real devuelto.
class ReturnHolder {
public int fieldFlag;
public TypeA A;
public TypeB B;
public TypeC C;
}
El ejemplo enum en otra respuesta es más de lo mismo. La razón por la que es un truco es que el código que gestiona el regreso de este método tendrá que tener un montón de código para controlar cada una de las diferentes posibilidades, al igual que
main(){
FooType *x = new FooType();
ReturnHolder ret = x.f();
switch (ret.fieldFlag)
case: 1
//read ret.A
case: 2
//read ret.B
case: 3
//read ret.C
}
Y eso es sin tener que ir a tratar de hazlo con Excepciones que introducen problemas aún mayores. Tal vez lo agregue más adelante como una edición.
El ejemplo no parece tres tipos diferentes, es una buena solución. Suena más como tres instancias diferentes de una región. ¿Puedes dar un mejor ejemplo o una descripción real de lo que intentas hacer? –