Voici un exemple (artificiel) d'utilisation d'une fonction qui renvoie une structure anonyme et "quelque chose" utile: Il y a quelques points que je voudrais discuter: p> Au fait, quelle fonction Peut-être la ligne Je pense que j'essayais d'essayer de supprimer la structure anonyme comme un éventail de flotteurs, quelque chose comme float * F = nouveau flotteur [2]. Ce qui pourrait être faux, comme le suggère le commentaire ci-dessous, alors que peut-on faire? Puis-je supprimer du tout? p> Je peux compiler et exécuter ce code "AS-" "sur VS2008, peut-être être utilisée certaines extensions non standard pourraient être utilisées par VS, mais il gère et donne 15 et 30 comme la réponse. P> des réponses, je crois que cette invention concerne une entité spécifique VS2008, il n'est pas conforme aux normes et donc non portable. Dommage si mal, j'aurais aimé voir ce que Voodoo Les personnes Stackoverflow ou Boost sont proposées si c'était dans leur arsenal :). Merci tout. P> p>
Func code>, puis-je faire quelque chose de similaire sans retourner un pointeur? LI>
foo (A, B) code> est, pour renvoyer une structure contenant deux nombres, la somme de tous les nombres de 1 à A et le produit d'a et b. P>
NEW T CODE> pourrait utiliser un boost :: Shared_ptr en quelque sorte pour éviter les fuites, mais je n'ai pas essayé cela. Cela fonctionnerait-il? P>
5 Réponses :
Pour l'instant, votre code n'est pas portable; Par exemple, il ne construira pas avec Section 14.3.1 / 2 de la norme dit: P> Un type local, un type sans
Linkage, Voir l'article 488 dans le Rapports de défauts de langage noyau standard C ++, révision 69 et PAPIER N2657 pour une évolution possible. P> supposant que votre code a été bien formé, alors: p> Vous pourrez peut-être réécrire: p>
Vous pouvez renvoyer un Aucune utilisation du monde réel que je peux voir autre qu'une manière extrêmement convoluée d'essayer de ne pas attribuer de nom explicite à la structure; On utiliserait généralement des structures anonymes (non techniquement légales en C ++, mais appuyée par divers compilateurs comme extensions) afin de ne pas polluer l'espace de noms, généralement en instanciant immédiatement (vous pouvez par exemple voir des foncteurs d'un coup d'œil instancié et transmis comme structs anonymes - encore une fois, techniquement pas légal C ++.) P> li>
OL> Merci Amener celui-ci ici à partir des commentaires: appeler Bien sûr, était votre code par magie bien formé, gcc code>.
composé de l'un de ces types
ne doit pas être utilisé comme modèle-
argument fort> pour un modèle
paramètre de type. p>
blockQuote> Mise à jour 1 h3>
delete (int*)f;
struct anonyme code> par valeur à condition que la structure anonyme avait un constructeur prenant un autre type (anonyme ou non, que vous pourriez initialiser à l'intérieur du corps de Votre méthode) - sauf, bien sûr, comment spécifiez-vous un constructeur pour une structure anonyme? :) p> li>
Mise à jour 2 h3>
GF code> pour le lien vers la partie correspondante de la norme C ++ concernant les nouveaux types qui peuvent ne pas être définis dans un type de retour. p>
Mise à jour 3 h3>
Suppr [] code> sur la mémoire allouée avec
Nouveau code> (comme opposé à
nouveau [] code>) est une invitation à la corruption du tas. Appeler
Supprimer code> sur un pointeur dont vous ne savez pas le type que vous ne connaissez pas est techniquement non défini (quel destructeur doit être appelé?) Mais dans le cas de gousses (votre structure anonyme étant une), vous pouvez vous en tirer dans cette horrible strong> pirate de manière pirate: p>
std :: auto_ptr code> aurait été capable de conserver le type anonyme et aurait pris soin de l'appelant
Supprimer code> pour vous correctement et gracieusement. p> p>
Merci pour l'évolution possible dans ce contexte.
@Vlad: Même avec N2657 intégré son non-portable en raison de définitions de type non autorisées dans les types de retour.
@gf, true, quand je dis en supposant que votre code a été bien formé Code> C'est une grande hypothèse allant au-delà de N2657, mais prétendons que
g ++ code> a également pris en charge que Comme une extension à l'avenir (
GCC CODE> l'avalera simplement une amende lorsque vous construisez C, tout comme MSVC le faisait pour l'op ...) Merci pour la référence standard BTW! :)
A écrit cela avant la mise à jour. Même alors, il n'y a pas de structures anonymes en C ++ comme le dit Kirill. Je ne pense pas à une discussion sur ce que-serait-be-si-la langue-était-différent nous donne n'importe quoi :)
standard C ++ n'autorise pas les structures anonymes. P>
Vous voudrez peut-être rendre cela plus précis. 14.3.1 / 2 la maintienne pour une situation spécifique et il est évident que la règle n'est nécessaire que si elles sont généralement autorisées.
@Msalters, Sans nom Structures i> sont généralement autorisés, mais pas anonyme i>. Le premier est celui-ci, lequel C ++ prend en charge: struct {int i; } une; A.I = 0; code> (le type n'a pas de nom). La seconde est celle-ci, laquelle c ++ ne prend pas en charge:
struct {int i; }; i = 0; code> (le type n'a aucun nom et il s'échappe dans la portée environnante).
Je ne peux penser à une utilisation raisonnable. Outre les fuites de mémoire, c'est un moyen très illisible d'atteindre l'objectif que vous voulez. Cela rend votre lecteur à penser beaucoup ce que fait le code. Et aussi, il n'est pas connu qui devrait supprimer 'f' dans la principale (). Et devrait-il être supprimé avec Suppr [] ou Supprimer?
J'utiliserais une classe qui prendrait le 'A' et 'B' dans le constructeur. Il aura deux méthodes pour obtenir les deux membres de la structure calculés. Et à l'intérieur de la classe, il y aura des Mehotds privés, en utilisant des boucles simples pour calculer les choses que vous voulez. Ensuite, votre API ressemblera à ceci: p>
Oui, je pense que j'ai mentionné dans ma question que c'est un exemple de réveillé et je pourrais faire cette chose qu'il fait de manière beaucoup plus simple que vous l'avez suggéré. Cependant, ma question était simplement de trouver une voie où cela pourrait être le moyen de faire des choses. Je crois que ce serait pratique si une fonction renvoyait quelque chose que je pouvais accéder à diverses parties de ne pas avoir à faire une structure spéciale. Par exemple, l'utilisation: FOO (5,6) -> A est élégante et je n'ai pas à définir un nom de structure séparé pour cela. Quoi qu'il en soit, le code n'est pas portable et il est spécifique VS2008. Merci.
Désolé, mais 'foo (5,6) -> a' pourrait être pratique, mais je ne pense pas que ce soit élégant. Il est difficile de lire car normalement vous avez des appels comme "Objet-> Méthode ()". Dans ce cas, c'est exactement le contraire - le côté gauche est une fonction renvoyant une structure et le côté droit n'est qu'un membre. En outre, il est difficile de déboguer. Mais cet exemple est bon pour les tests d'étudiants;)
Ce que vous faites n'est pas possible dans les définitions de type C ++ standard ne sont pas autorisées dans les types de retour, conformément aux §8.3.5 / 6 em> (déclarants de fonction, C ++ 03): P >
types ne doit pas être défini dans les types de retour ou de paramètre. p>
blockQuote>
Visual Studio n'est pas conforme dans ce cas. P>
Une approximation étroite d'une structure anonyme est un tuple. Boost :: Tuple est disponible n'importe où maintenant et il y en a une autre dans TR1 [que je suppose est distribué avec VS2008] avec une interface proche identique. Comme d'autres personnes, le schéma global est assez fragile, mais je voulais me concentrer sur le tuple plutôt que le design. P> p>
Bonne discussion, mais pouvez-vous mieux qualifier ce que vous vouliez dire par "proche approximation"? (I.e. Programmeur POV / Intention par opposition au Compilateur POV, où l'intention de programmeur peut ne pas avoir à proposer un autre nom de type pour la nième incarnation d'un tuple, peut coder la lisibilité en souffrance ou à la fleurir.)
Supprimer [] code> sur la mémoire allouée avec
Nouveau code>? AIE!
Je sais que je suis juste en train d'essayer de supprimer la structure anonyme comme un éventail de flotteurs, quelque chose comme Float * F = nouveau flotteur [2].
Je suis presque positif que vous ne pouvez pas le faire du tout, donc s'il y a des utilisations ou non n'a pas d'importance.
@Dennis Zickefoose: Je peux compiler et exécuter cela sur VS2008, peut-être être utilisée certaines extensions non standard. Mais je suis positif, cela fonctionne sur VS2008.
Essayez de faire quelque chose après la suppression []; tout peut arriver là-bas.