DUPLICATES possibles: strong>
surcharge de fonction par type de retour?
Puzzle: surcharge une fonction C ++ en fonction de la valeur de retour a > p>Parce que j'ai une bibliothèque qui expose un tas de fonctions sous la forme de: p>
xxx pré> et maintenant je dois envelopper ces. Je préférerais ne pas réécrire le même ensemble de fonctions. Je voudrais faire quelque chose comme p>
xxx pré> mais je ne peux pas sembler obtenir ce travail. Des idées? P> blockQuote>
5 Réponses :
Vous pouvez essayer p>
modèle t getval (t) {...} code> à la place (à l'aide d'une variable factice pour effectuer une résolution) li>
- Utilisez les conversions de type LI>
ol>
ou simplement utiliser le getvalbool code simpliste> etc. p>
Il n'y a pas de différence entre modèle template
@Ephement: Regardez à nouveau - il a passé un paramètre factice pour effectuer des travaux de surcharge.
Il n'y a qu'une seule fonction en C ++ pouvant être surchargée par type de retour, la fonction spéciale de l'opérateur de conversion implicite, nommée opérateur t () code> (avec t code> variable). < / p>
Vous ne pouvez pas surcharger les types de retour, car il n'est pas obligatoire d'utiliser la valeur de retour des fonctions dans une expression d'appel de fonction.
Par exemple, je peux simplement dire P>
GetVal();
Le compilateur pourrait simplement émettre un message "Type de retour ambigu" et refuser de compiler. Ce n'est pas assez de justification par lui-même.
@Mark Ransom: prie de différer ici. Reportez-vous à 7,4,1 $ de "Le langage de programmation C ++ 3ème édition" de STROSTRUP
Sinon: Supposons que nous définissions float getval () code> et double getval () code> et écrire int x = getval (); code>. Maintenant quoi? Soit un float code> ou un double code> peut être implicitement converti en int code>.
@Karl Knechtel: Non. Le compilateur ne permettrait pas de définir de telles surcharges en premier lieu en donnant une erreur.
Je pense qu'une chose est que la langue ne le permet tout simplement pas, l'autre chose est pourquoi pas. "Qu'est-ce que le compilateur fait maintenant?" - Cela pourrait émettre une erreur, ce qui serait une bonne chose, car il s'agit probablement d'une erreur logique de ne pas utiliser (ou d'ignorer explicitement) le résultat. Quant à Karl's "maintenant quoi?" - le même raisonnement pourrait également être appliqué à la surcharge sur les paramètres: vidien f (double); vide f (flotteur); f (10); code> "maintenant quoi?". Ce n'est pas un principe de surcharge qu'il doit être exempt d'ambiguïté. - En outre, si vous regardez la question liée, surcharge sur le type de retour peut i> être émulée en C ++.
Je suppose qu'une forme plus générale de cet argument serait "si le résultat de l'appelant une fonction dépend de l'endroit où il est appelé?" Cela semble être un principe dangereux. Si j'appelle une fonction f (x) code>, le résultat doit être identique, peu importe qui je suis et où je l'ai appelé et ce que je prévois de faire avec le résultat.
@jalf mais dans ce cas, INT F (X) et Double F (X) sont deux fonctions différentes. Dans tous les cas, même appeler INT F (x) deux fois n'est jamais garanti de renvoyer le même résultat en raison de la conservation de données en interne (via des variables statiques) ou de renvoyer différents résultats basés sur d'autres variables de classe ou des sources de données externes, il est accessible. Une garantie selon laquelle une fonction F (x) renvoie toujours le même résultat n'est possible que dans quelques langues spécialisées qui imposent beaucoup d'autres restrictions afin de rendre cette garantie, et C ++ n'est pas l'une d'entre elles.
Le type de retour des fonctions ne fait pas partie du nom mangelé généré par le compilateur pour identifier de manière unique chaque fonction. Chacun des éléments suivants: p>
sont les paramètres utilisés pour générer le nom de la mutilé unique pour chaque fonction. Il est sur la base de ces noms non mangés uniques que le compilateur peut comprendre quelle fonction appeler même si les noms sont les mêmes (surcharge). P>
Même si le type de retour a été utilisé pour Name Mangling, il ne serait pas possible de déterminer la fonction exacte à appeler si la valeur de retour de l'appel de fonction a été supprimée.
Pour être précis: le fait que Name Mangling ne compte pas que le type de retour soit un résultat, pas une cause. Si la norme avait dit que c'était possible, Name Mangling Qwoud aurait inclus le type de retour.
@ Chubsdad, Msalters: convenu, point bien fait!
Non, vous ne pouvez pas surcharger en fonction du type de retour. P>
des documents standard., Sec 13.1.2 em>, p>
- Les déclarations de fonction qui diffèrent uniquement dans le type de retour ne peuvent pas être surchargées. strong> p>
blockQuote>
et en ce qui concerne votre bibliothèque, chaque fonction peut appartenir à un espace de noms différent, sinon ce n'est pas possible non plus. P>
Outre le lien ci-dessus, il y a aussi Stackoverflow.com/questions/226144/... et quelques autres
Vous dites que vous avez une bibliothèque qui surcharge déjà par type de retour? Cela semble improbable
@JAlf: Je suppose que les fonctions sont dans différents espaces de noms.
@Als: Peut-être. Ou peut-être qu'ils ont réellement des noms différents. Nous ne savons pas, mais la question, telle qu'elle se trouve, implique qu'il a une bibliothèque qui fait déjà ce qu'il dit qu'il ne peut pas faire (et qui est impossible), puis compte tenu de cette prémisse, il essaie de faire quelque chose de tout à fait Différent qui pourrait être atteint avec une spécialisation de modèle (mappage d'un
getval () code> à différentes implémentations en fonction du type de t code>