6
votes

Ignorer un résultat de renvoi par référence d'une fonction

Supposons que j'ai une fonction qui renvoie un résultat important et plusieurs résultats sans importance. Je l'ai dit pour que les résultats sans importance soient renvoyés par référence: xxx pré>

Je voudrais appeler cette fonction pour calculer certaines choses, mais sur le site d'appel, je veux ignorer les résultats sans importance. Je pourrais le faire comme suit: P>

int result = CalculateStuff(100, 42, auto_ptr(new int).get(), auto_ptr(new int).get());


1 commentaires

Ajouté comme un commentaire car il ne répond pas à votre question - mais je déclare généralement temporairement appelé _ et que cela se présente. "CalculateStuff (100, 42, _, _); semble raisonnablement clair.


6 Réponses :


4
votes

C'est légal; Auto_PTR Les objets resteront en vie jusqu'à la fin de l'expression (c'est-à-dire appel de la fonction). Mais c'est laid comme l'enfer.

Il suffit de surcharger votre fonction: xxx


3 commentaires

Cela supplie toujours la question la question , comment allez-vous mettre en œuvre la deuxième surcharge? Allez-vous utiliser des variables factices ou * nouveau int ou auto_ptr ou quoi, afin que vous puissiez appeler la première surcharge de la seconde?


@Nawaz Par exemple, en créant deux variables temporaires ou en appelant une troisième mise en œuvre (par exemple, celle avec des pointeurs que vous avez suggéré).


Mais c'est exactement la question.



3
votes

Approche recommandée Si vous avez le contrôle sur la fonction serait: renvoyer un std :: tuple (ou boost :: tuple ) avec tous les résultats ou écrivez une surcharge cela n'a pas besoin des variables supplémentaires.


0 commentaires

3
votes

Voici mes conseils: Si vous devez demander de manière à comprendre l'exactitude du code et de sa sémantique, le code échoue à exprimer clairement votre intention .

Je pense que le première version (avec Dummy1 et Dummy2 ) est le plus transparent et est évidemment correct.

Si vous vous trouvez à plusieurs reprises de la fonction et de ne pas vouloir Les résultats optionnels, vous pouvez fournir une surcharge: xxx


0 commentaires

4
votes

Selon Bjarne Stroustrup, si certains paramètres sont facultatifs, il s'agit d'un cas idéal pour les faire de type pointeur, de sorte que vous puissiez passer null lorsque vous n'avez pas besoin de passer des arguments pour eux: xxx

et utiliser: xxx

toutes les autres alternatives ne seraient pas aussi bonnes que celle-ci, ou du moins pas mieux < / em> que cela.

Bien sûr, la mise en œuvre de CalculateStuff doit vérifier les paramètres si ils sont null ou non.


0 commentaires

3
votes

Vous pouvez faire une classe qui fournit une conversion implicite (ou explicite) vers int & . xxx

Vous pouvez en outre faire un modèle et ajouter des surcharges de const. < / p>


2 commentaires

Le type d'ignorée ne sera-t-il pas et vous donnera des problèmes?


@Winstonewert: Pourquoi? Un temporaire ne peut pas se lier directement à une référence non-Const. Cependant, on peut appeler des méthodes non constituées d'un objet temporaire. C'est ce que cela profite.



2
votes

C'est légal, mais il n'est pas garanti de ne pas fuir la mémoire, voir la question 3 ici par exemple.

La manière correcte et idiomatique de mise en œuvre de la sortie en option est de passer un pointeur, passant null lorsque vous ne voulez pas les résultats et tester Pour null dans la fonction avant d'écrire via le pointeur.


0 commentaires