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: 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());
6 Réponses :
C'est légal; Il suffit de surcharger votre fonction: p> Auto_PTR CODE> 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.
Cela supplie toujours la question la question i>, comment allez-vous mettre en œuvre la deuxième surcharge? Allez-vous utiliser des variables factices ou * nouveau int code> ou
auto_ptr code> 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.
Approche recommandée Si vous avez le contrôle sur la fonction serait: renvoyer un std :: tuple code> (ou
boost :: tuple code>) avec tous les résultats ou écrivez une surcharge cela n'a pas besoin des variables supplémentaires. P>
Voici mes conseils: Si vous devez demander de manière à comprendre l'exactitude du code et de sa sémantique, le code Je pense que le première version (avec Si vous vous trouvez à plusieurs reprises de la fonction et de ne pas vouloir Les résultats optionnels, vous pouvez fournir une surcharge: p> Dummy1 code> et
Dummy2 code>) est le plus transparent et est évidemment correct. p>
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 et utiliser: p> toutes les autres alternatives ne seraient pas aussi bonnes que celle-ci, ou du moins pas mieux < / em> que cela. p> Bien sûr, la mise en œuvre de null code> lorsque vous n'avez pas besoin de passer des arguments pour eux:
CalculateStuff code> doit vérifier les paramètres si ils sont
null code> ou non. P > p>
Vous pouvez faire une classe qui fournit une conversion implicite (ou explicite) vers Vous pouvez en outre faire un modèle et ajouter des surcharges de const. < / p> p> int & code>.
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.
C'est légal, mais il n'est pas garanti de ne pas fuir la mémoire, voir la question 3 ici par exemple. P>
La manière correcte et idiomatique de mise en œuvre de la sortie en option est de passer
un pointeur, passant null code> lorsque vous ne voulez pas les résultats et tester
Pour
null code> dans la fonction avant d'écrire via le pointeur. p>
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.