9
votes

Comment utiliser Boost :: Facultatif pour renvoyer NULL en C ++?

J'ai une fonction qui doit renvoyer NULL dans certains cas et une autre fonction doit tester la valeur de retour de cette fonction. Je suis au courant de boost :: facultatif mais je ne suis pas sûr de savoir comment utiliser la syntaxe.

ci-dessous serait un exemple simple de ladite utilisation: P>

int funct1(const string& key) {
  // use iterator to look for key in a map
  if(iterator == map.end()) {
    return NULL // need help here!
  else
    return it->second;
}

void funct2(string key) {
  if(funct1(key) == NULL) { // <-- need help here!
    // do something
  } else {
    // do something else
  }


1 commentaires

Vous avez posé 10 questions et accepté 0 réponses. Vous devriez revenir en arrière et accepter les bonnes réponses.


3 Réponses :


14
votes

Il reste dans l'état " null " jusqu'à ce que vous le définis. Vous pouvez utiliser cet idiome: xxx

puis: xxx


0 commentaires

1
votes

Essayez ceci:

typedef boost::optional<int> OptionalInt;


1 commentaires

La documentation boost.Optional indique que is_initialisé est obsolète; Utilisez plutôt l'opérateur de conversion bool à la place (par exemple si (résultat) {...} ). En outre, votre FunCt1 Le type de retour ne doit pas être int .



3
votes

Permettez-moi de mentionner quelques choses avant que je reçoive la question.

Si la chaîne doit toujours être trouvée (erreur de programmation si ce n'est pas), vous devez probablement lancer si cela ne peut pas être au lieu d'utiliser un optionnel. Vous voudrez peut-être même essayer / attraper / jeter même s'il s'agit d'une entrée utilisateur.

Si votre classeur imitat de conteneur comme une sémantique, vous devez envisager d'utiliser une phrase Sentinel pour indiquer que cela n'a pas été trouvé, pas NULL.

Si cependant retourner une représentation NULL est ce que vous êtes après, votre type de retour serait boost :: optionnel et le retour null serait retour boost :: aucun ; .


3 commentaires

HI Mark B. - Pourquoi vous recommandez-vous de retourner Boost :: Néant tandis que les autres préfèrent simplement retourner la facultative elle-même? Y a-t-il une différence? S'il y a, lequel est préféré dans un code professionnel? Mon code est destiné à être une bibliothèque que d'autres utilisateurs peuvent utiliser, d'essayer / jetteraient / lancez-la plus préférées dans le code qui repose fortement sur la saisie de l'utilisateur? Merci.


Je recommanderais également d'utiliser Boost :: Aucun , car il augmente la lisibilité (à mon avis).


Boost :: Aucun est la valeur par défaut de tout boost :: facultatif