Pregunta

¿Por qué no vemos lenguajes de tipo C que permiten llamadas con polimorfismo en el tipo de retorno? Pude ver cómo la inferencia de tipo adicional sería un obstáculo, pero tenemos muchos idiomas con sistemas de inferencia de tipos completos (que funcionan para diferentes niveles de "trabajo").

Editar: Por polimorfismo de tipo de retorno me refiero a sobrecargar la firma de la función solo en el tipo de retorno. Por ejemplo, C ++ y Java solo permiten la sobrecarga en el tipo de parámetros formales, no en el tipo de retorno.

¿Fue útil?

Solución

Si por " tipo de retorno polimorfismo " te refieres a una sobrecarga basada en el tipo de valor de retorno, no estoy seguro acerca de otros lenguajes, pero para C ++ aquí está la respuesta (más o menos de la boca del caballo):

Los tipos de retorno de funciones no entran en juego en la resolución de sobrecarga simplemente porque Stroustrup (supongo que con la entrada de otros arquitectos de C ++) quería que la resolución de sobrecarga fuera 'independiente del contexto'. Ver 7.4.1 - '' Sobrecarga y tipo de retorno '' del lenguaje de programación C ++, tercera edición.

  

El motivo es mantener la resolución de   un operador o función individual   llamada independiente del contexto.

Querían que se basara solo en cómo se llamaba la sobrecarga, no en cómo se usaba el resultado (si se usaba). De hecho, muchas funciones se llaman sin usar el resultado o el resultado se usaría como parte de una expresión más grande. Un factor que estoy seguro entró en juego cuando decidieron que esto era que si el tipo de retorno era parte de la resolución, habría muchas llamadas a funciones sobrecargadas que tendrían que resolverse con reglas complejas o tendrían que arrojar el compilador un error de que la llamada era ambigua.

Y, Dios sabe, la resolución de sobrecarga de C ++ es lo suficientemente compleja como está ...

Otros consejos

me encantaría ver esta característica en algún lenguaje, no solo para que la función foo pueda devolver un doble o un int o una cadena, sino también para que pueda devolver una estructura u objetos de diferentes clases. Las llamadas ambiguas serían bastante triviales: si la llamada es ambigua, se requiere una conversión para seleccionar el tipo de retorno deseado. Ejemplo:

string s = foo();    //foo returns a string
double x = foo();    //foo returns a double
int i = foo();       //foo returns an integer
float f = (float)(int)foo();    //call the int foo and convert to float

además

Animal a = fooFactory();    //fooFactory returns an Animal
Plant p = fooFactory();     //foofactory returns a Plant

estas situaciones no aparecen con mucha frecuencia, pero cuando lo hacen, la solución suele ser bastante fea ...

double x = (double)foo();

Lo anterior es ambiguo si hay versiones de foo () que pueden devolver double, int, float, etc.

En C ++ puede hacer esto con clases en gran medida. Por ejemplo, supongamos que tengo un tipo de datos que se convierte habitualmente a ASCII en entrada y salida;

typedef char* pchar;

class   MyType
{
public:

 operator pchar() { return(ConvertToASCII()); }
 MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }

 pchar ConvertToASCII();
 void ConvertFromASCII(pchar ASCII);
}

Este tipo de cosas se usa a menudo en marcos de trabajo de C ++. Por ejemplo, eche un vistazo a la implicación de la clase MFC CString. En mi humilde opinión, es una herramienta muy útil, aunque peligrosa en ciertas circunstancias.

Debido a la conversión automática de tipos, no es obvio saber a qué función llamar cuando los tipos de retorno están cerca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top