2012-09-18 4 views
2

Cela donne une exception bad_lexical_cast:std :: string à int8_t

int8_t i = boost::lexical_cast<int8_t>("12"); 

Je voudrais avoir une exception lorsque la valeur ne correspond pas à un int8_t.

Comment est-ce que je devrais faire ceci? Devrais-je lancer un int en premier et lancer une exception si la valeur tombe en dehors de la plage -128 à 127?

Je suis également intéressé par la conversion de chaînes en uint8_t.

+5

Le 'bad_lexical_cast' est déjà une exception, pourquoi ne pas prendre et que si vous voulez, jeter votre propre exception? – Nim

+0

Bien sûr, l'utilisation de 'int8_t' n'est pas portable. Il est "facultatif", c'est-à-dire que les implémentations ne sont pas requises pour le fournir. –

Répondre

3

lexical_cast d'un int8_t ou uint8_t est traitée comme char.

Vous pouvez combiner lexical_cast avec numeric_cast pour obtenir ce que vous voulez:

#include <boost/numeric/conversion/cast.hpp> 
#include <boost/lexical_cast.hpp> 

using boost::lexical_cast; 
using boost::numeric_cast; 

numeric_cast<int8_t>(lexical_cast<int>("128")); 
numeric_cast<uint8_t>(lexical_cast<int>("256")); 
+0

Cool! Je peux maintenant écrire un foncteur de conversion qui prend une référence à la valeur du type désiré et la chaîne à partir de laquelle convertir. – Baz