0
votes

Y a-t-il des descentes avec l'utilisation de STD :: cravate pour la manipulation erronée de Golang, tout en retournant un résultat? (C ++ 11)

En allez un moyen courant de faire la manipulation des erreurs et de retourner toujours une valeur consiste à utiliser des tuples.

Je me demandais si vous faites la même chose en C ++ en utilisant STD :: Cravate serait une bonne idée lorsque des exceptions ne sont pas applicables.

comme xxx

y a-t-il des descentes pour le faire (performance ou autrement)? Je suppose que l'optimisation de la valeur de retour ne fait pas vraiment de différence, mais je me trompe peut-être.

Un cas problématique potentiel que je pouvais voir est l'utilisation dans une API de compilateur, mais ce n'est pas spécifique à Cette utilisation.

La voie actuelle que je fais cela est xxx

mais qui permet de transmettre une valeur pour les données.

Le code d'erreur lui-même est quelque chose qui est déjà défini et que je ne peux pas changer.

edit: J'utilise / je dois utiliser c ++ 11 < / p>


7 commentaires

Mieux est C ++ 17 et des liaisons structurées, sans avoir besoin de déclarer des variables à Cravate les résultats dans: auto const [Errorcode, données] = LoadData (); . Et lorsque vous n'avez pas besoin d'un code d'erreur, juste la présence ou l'absence d'un résultat, utilisez std :: facultatif .


Encore mieux utiliserait variante soit une erreur ou une valeur de résultat. Mais en utilisant variante est douloureux, au moins en C ++ 11 (où vous devez même la rétrodiquer).


Quel est le point, Enum est utilisé. Il est préférable d'utiliser la référence sur std :: error_code et comme premier paramètre et utilisez le retour pour autre chose. Vous pouvez vérifier l'erreur personnalisée code / condition i Utilisation pour iconv Conversion du jeu de caractères


J'aurais dû préciser que je demande spécifiquement pour C ++ 11


@ user13676 Vous pouvez backport en option et variante à l'aide d'une en-tête uniquement des bibliothèques.


@ziggystar par exemple Ils peuvent utiliser Boost, à partir de laquelle ces classes ont été portées à std .


Github.com/tartanlama/Expectected


3 Réponses :


1
votes

Il existe plusieurs stratégies concurrentes pour la manipulation des erreurs. Je ne vais pas y entrer, car cela dépasse la portée de la question, mais la gestion des erreurs par les codes d'erreur de retour n'est qu'une seule option. Envisager des alternatives telles que std :: facultatif ou exceptions, qui sont toutes deux courantes en C ++, mais pas en déplacement.

Si vous avez une fonction destinée à renvoyer une valeur de code d'erreur de style Go, puis votre solution std :: cravate est parfaitement bien en C ++ 11 ou C + 14, bien que En C ++ 17, vous préféreriez plutôt les fixations structurées.


2 commentaires

Et si l'erreur est un cas commun? N'excriffez pas un mauvais choix alors?


@ user13676 Je ne dis pas que vous devez utiliser des exceptions. Il existe certainement des situations où les codes d'erreur ou le retour de STD :: facultatif sont de meilleures solutions. Herb Sutter travaille sur de vraies exceptions à coûts zéro, qui est intéressante, mais non disponible: www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/P0709R0.pdf



0
votes

Y a-t-il des inconvénients pour le faire (performance ou autrement)? P>

Oui. Avec Cravate code>, une copie ou un déplacement des valeurs retournées est requise, ce qui ne serait pas nécessaire si vous éviterez Cravate CODE>: P>

data = std::move(std::get<1>(result));


2 commentaires

L'optimisation de la valeur de retour ne s'applique pas dans ce cas?


@ User13676 L'optimisation de la valeur de retour est indépendante du cas d'utilisation qui est discuté ici. Dans tous les cas, l'appelant doit fournir un peu d'espace où le résultat de l'appel de la fonction est écrit à (avec ou sans RVO). Avec auto (sans cravate ), c'est tout ce qui est nécessaire. Mais avec cravate , les pièces sont déplacées (ou copiées) dans la destination; C'est un travail supplémentaire.



2
votes

Parfois, les paramètres de sortie sont très utiles. Supposons que loaddata retourne std :: vecteur et est appelé dans une boucle: xxx

dans ce cas LoadData devra attribuer la mémoire sur chaque itération. Cependant, si vous passez data comme paramètre de sortie, l'espace précédemment attribué peut être réutilisé: xxx

si ce qui précède n'est pas préoccupé, alors vous pourrait vouloir jeter un coup d'œil à attendu . Il représente

  • une valeur de type t , type de valeur attendue; ou
  • une valeur de type E , un type d'erreur utilisé lorsqu'un résultat inattendu s'est produit.

    avec attendu , loaddata () Signature pourrait ressembler à: xxx

    c ++ 11 La mise en œuvre est disponible: https://github.com/tartanlama/Expecté


0 commentaires