Hoe boost :: optional <T> gebruiken om NULL in C ++ te retourneren?

Ik heb een functie die in sommige gevallen NULL moet retourneren en er is een andere functie die moet testen of de retourwaarde van deze functie werkt. Ik ben op de hoogte van boost :: optioneel, maar weet niet zeker hoe de syntaxis moet worden gebruikt.

Hieronder zou een eenvoudig voorbeeld van genoemd gebruik zijn:

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
  }

Kan iemand u alstublieft helpen met de syntaxis?

Bedankt.

9
Je hebt 10 vragen gesteld en 0 antwoorden geaccepteerd. Je moet teruggaan en de juiste antwoorden accepteren.
toegevoegd de auteur Mark Ingram, de bron

3 antwoord

Het blijft in de staat " NULL " totdat u het hebt ingesteld. U kunt dit idioom gebruiken:

optional funct1(const string& key) {
 //use iterator to look for key in a map
  optional ret; 
  if (iterator != map.end()) 
  {
    ret =  it->second;
  }

  return ret;
}

Dan:

if (!funct1(key)) { /* no value */ }
14
toegevoegd

Laat me een paar dingen noemen voor ik de vraag krijg.

Als de string altijd gevonden moet worden (programmeur fout als dat niet het geval is), zou je waarschijnlijk moeten gooien als het niet kan, in plaats van een optionele te gebruiken. Misschien wil je zelfs proberen/vangen/gooien, zelfs als het gebruikersinvoer is.

Als uw klas containerachtige semantiek bootst, moet u overwegen een end -wachtwoord te gebruiken om aan te geven dat het niet is gevonden, niet nul.

If however returning a null representation is what you're after, your function return type would be boost::optional and the null return would be return boost::none;.

3
toegevoegd
Hallo Mark B. - Waarom raadt u aan om boost terug te geven: geen terwijl de anderen liever gewoon de optionele zelf retourneren? Is er een verschil? Als dat zo is, welke heeft de voorkeur in een professionele codering? Mijn code is bedoeld als een bibliotheek die andere gebruikers kunnen gebruiken, dus zou proberen/vangen/gooien meer de voorkeur hebben in code die sterk afhankelijk is van gebruikersinvoer? Bedankt.
toegevoegd de auteur czchlong, de bron
Ik zou ook aanraden om boost :: none te gebruiken, omdat het de leesbaarheid vergroot (naar mijn mening).
toegevoegd de auteur Luc Touraille, de bron

Probeer dit:

int funct1(const string& key)
{
 //use iterator to look for key in a map
  if(iterator == map.end())
    return boost::optional();
  else
    return boost::optional(it->second);
}

void funct2(string key)
{
  const boost::optional result = funct1(key);
  if (result.is_initialized())
  {
   //Value exists (use result.get() to access it)
  } 
  else
  {
   //Value doesn't exist
  }
}

Ik zou ook de sjabloon typen om dingen eenvoudiger te maken:

typedef boost::optional OptionalInt;
1
toegevoegd
De Boost.Optionele documentatie zegt dat is_initialized is verouderd; gebruik in plaats daarvan de operator bool conversie (bijvoorbeeld als (resultaat) {...} ). Het retourtype funct1 mag ook niet int zijn.
toegevoegd de auteur ildjarn, de bron