Question

Pourquoi ne voyons-nous pas les langages de type C autorisant les appelables avec polymorphisme dans le type de retour? Je pouvais voir en quoi l'inférence de type supplémentaire serait un obstacle, mais nous avons beaucoup de langues avec des systèmes d'inférence de type à part entière (qui fonctionnent pour différents niveaux de "travail").

Modifier: Par polymorphisme de type de retour, j'entends surcharger la signature de fonction uniquement dans le type de retour. Par exemple, C ++ et Java n'autorisent la surcharge que dans le type des paramètres formels, pas dans le type de retour.

Était-ce utile?

La solution

Si par "polymorphisme de type de retour" " vous voulez dire surcharge en fonction du type de valeur de retour, je ne suis pas sûr des autres langages, mais pour C ++, voici la réponse (plutôt de la bouche du cheval):

Les types de retour de fonction n'interviennent pas dans la résolution de surcharge simplement parce que Stroustrup (avec l'aide d'autres architectes C ++) supposait que la résolution de surcharge soit "indépendante du contexte". Voir 7.4.1 - "Surcharge et type de retour" à partir du "Langage de programmation C ++, Troisième édition".

  

La raison est de garder la résolution pour   un opérateur individuel ou une fonction   appel indépendant du contexte.

Ils voulaient que cela se base uniquement sur la manière dont la surcharge était appelée - et non sur la manière dont le résultat était utilisé (s'il était utilisé du tout). En effet, de nombreuses fonctions sont appelées sans utiliser le résultat ou celui-ci serait utilisé dans le cadre d'une expression plus grande. Un facteur qui, j'en suis sûr, est entré en jeu quand ils ont décidé que ceci était le cas: si le type de retour faisait partie de la résolution, de nombreux appels à des fonctions surchargées devraient être résolus avec des règles complexes ou nécessiter le lancement du compilateur. une erreur indiquant que l'appel était ambigu.

Et, Dieu le sait, la résolution de la surcharge C ++ est suffisamment complexe en l’état actuel ...

Autres conseils

J'aimerais beaucoup voir cette fonctionnalité dans certaines langues, non seulement pour que la fonction foo puisse renvoyer un double, un int ou une chaîne, mais également pour que foo puisse renvoyer une structure ou des objets de classes différentes. Des appels sans ambiguïté seraient assez triviaux - si l'appel est ambigu, il faut un transtypage pour sélectionner le type de retour souhaité. Exemple:

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

en plus

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

ces situations ne se présentent pas très souvent, mais quand elles le font, la solution de contournement est souvent assez laide ...

double x = (double)foo();

Ce qui précède est ambigu s’il existe des versions de foo () pouvant renvoyer double, int, float, etc.

En C ++, vous pouvez le faire avec les classes dans une large mesure. Par exemple, disons que j'ai un type de données qui est systématiquement converti en ASCII en entrée et en sortie;

typedef char* pchar;

class   MyType
{
public:

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

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

Ce type de chose est souvent utilisé dans les frameworks C ++. Par exemple, examinez l’implémentation de la classe MFC CString. IMHO, c'est un outil très utile, bien que dangereux dans certaines circonstances.

En raison de la conversion automatique des types, il n'est pas évident de savoir quelle fonction appeler lorsque les types de retour sont proches.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top