Conversion d’un std :: ssortingng en bool

Quelle est la meilleure façon de convertir un std :: ssortingng en bool? J’appelle une fonction qui retourne “0” ou “1”, et j’ai besoin d’une solution propre pour la transformer en valeur booléenne.

Ce sera probablement exagéré pour vous, mais j’utiliserais boost :: lexical_cast

boost::lexical_cast("1") // returns true boost::lexical_cast("0") // returns false 

Je suis surpris que personne n’ait mentionné celui-ci:

 bool b; issortingngstream("1") >> b; 

ou

 bool b; issortingngstream("true") >> std::boolalpha >> b; 
 bool to_bool(std::ssortingng const& s) { return s != "0"; } 

Soit vous vous souciez de la possibilité d’une valeur de retour non valide ou vous ne le faites pas. Jusqu’à présent, la plupart des réponses se situent au milieu du terrain, capturant des chaînes autres que “0” et “1”, rationalisant peut-être la manière dont elles devraient être converties, en lançant peut-être une exception. Une entrée invalide ne peut pas produire de sortie valide, et vous ne devriez pas essayer de l’accepter.

Si vous ne vous souciez pas des retours non valides, utilisez s[0] == '1' . C’est super simple et évident. Si vous devez justifier sa tolérance à l’égard de quelqu’un, dites qu’il convertit la valeur invalide en false et que la chaîne vide sera probablement un seul \0 dans votre implémentation STL, ce qui la rend raisonnablement stable. s == "1" est également bon, mais s != "0" me semble obtus et rend invalide => vrai.

Si vous vous souciez des erreurs (et devrait probablement), utilisez

 if ( s.size() != 1 || s[0] < '0' || s[0] > '1' ) throw input_exception(); b = ( s[0] == '1' ); 

Cela attrape TOUTES les erreurs, il est aussi tout à fait évident et simple pour quiconque connaît un petit C, et rien ne sera plus rapide.

Il y a aussi std :: stoi dans c ++ 11:

bool value = std :: stoi (someSsortingng.c_str ());

Ecrire une fonction gratuite:

 bool ToBool( const std::ssortingng & s ) { return s.at(0) == '1'; } 

Il s’agit de la chose la plus simple qui puisse fonctionner, mais vous devez vous demander:

  • Que devrait retourner une chaîne vide? la version ci-dessus lance une exception
  • à quoi un caractère autre que “1” ou “0” devrait-il être converti?
  • est une chaîne de plus d’un caractère une entrée valide pour la fonction?

Je suis sûr qu’il y en a d’autres – c’est la joie de la conception d’API!

J’utiliserais ceci, qui fait ce que vous voulez, et attrape le cas d’erreur.

 bool to_bool(const std::ssortingng& x) { assert(x == "0" || x == "1"); return x == "1"; } 

Je changerais la fonction moche qui renvoie cette chaîne en premier lieu. C’est pour ça que bool est.

Essaye ça:

 bool value; if(ssortingng == "1") value = true; else if(ssortingng == "0") value = false; 
 bool to_bool(std::ssortingng const &ssortingng) { return ssortingng[0] == '1'; } 

Voici un moyen similaire à celui de Kyle, sauf qu’il gère les zéros et autres choses:

 bool to_bool(std::ssortingng const& s) { return atoi(s.c_str()); } 

Vous pouvez toujours envelopper la chaîne renvoyée dans une classe qui gère le concept de chaînes booléennes:

 class BoolSsortingng : public ssortingng { public: BoolSsortingng(ssortingng const &s) : ssortingng(s) { if (s != "0" && s != "1") { throw invalid_argument(s); } } operator bool() { return *this == "1"; } } 

Appelez quelque chose comme ceci:

 BoolSsortingng bs(func_that_returns_ssortingng()); if (bs) ...; else ...; 

Qui lancera invalid_argument si la règle concernant "0" et "1" est violée.