Extraction à partir de istream bool en fonction templated
-
04-10-2019 - |
Question
Je convertir lu ma classe de champs fonctions dans une fonction de modèle. Je cours sur le terrain pour int, unsigned int, long,
et unsigned long
. Tous ces utilisent la même méthode pour extraire une valeur d'un istringstream
(seul le changement de types):
template <typename Value_Type>
Value_Type Extract_Value(const std::string& input_string)
{
std::istringstream m_string_stream;
m_string_stream.str(input_string);
m_string_stream.clear();
m_string_stream >> value;
return;
}
La partie la plus délicate est le type de bool
(booléen). Il y a beaucoup de représentations textuelles pour booléenne:
0, 1, T, F, TRUE, FALSE
, et toutes les combinaisons de casse insensible
Voici les questions suivantes:
- Qu'est-ce que le C ++ sont par exemple la norme
des données valides pour extraire un
bool
, en utilisant l'extraction de flux opérateur? - Comme booléenne peut être représenté par
texte, que cela implique
locale
s? - Est-dépendante cette plate-forme?
Je voudrais simplifier mon code par ne pas écrire mon propre gestionnaire pour l'entrée bool
.
J'utilise MS Visual Studio 2008 (version 9), C ++ et Windows XP et Vista.
La solution
Les chaînes pour vrai et faux sont définis par std::numpunct::truename()
et std::numpunct::falsename()
. Vous pouvez obtenir le numpunct
pour un flux donné avec use_facet <numpunct <char> >(stream.getloc())
, si je comprends bien la documentation.
EDIT: Vous pouvez basculer si vous souhaitez utiliser "1"
/ ou "0"
"true"
/ "false
avec std::noboolalpha
et std::boolalpha
.