pourquoi cette conversion ne fonctionne pas?
-
12-09-2019 - |
Question
Ci-dessous mon fonct. Je l'appelle avec
if(try_strtol(v, rhs))
et ERS = "15 \ t // commentaire"
bool try_strtol(int64_t &v, const string& s)
{
try
{
std::stringstream ss(s);
if ((ss >> v).fail() || !(ss >> std::ws).eof())
throw std::bad_cast();
return true;
}
catch(...)
{
return false;
}
}
Il retourne false, i, sauf le cas avec v = 15. Comment puis-je résoudre ce problème?
La solution
Si vous voulez revenir un booléen, faites ceci:
bool try_strtol(int64_t &v, const string& s)
{
std::stringstream ss(s);
return (ss >> v).fail() || !(ss >> std::ws).eof();
}
Et il est défaillant parce qu'il est un mauvais casting. Avez-vous espériez le commentaire serait ignoré?
Autres conseils
Pourquoi pensez-vous que (ss >> std::ws).eof()
pour être vrai? rhs contient des caractères non-blancs après 15, de sorte que la condition sera si vrai et l'exception sera levée, ce qui est la raison pour laquelle il retourne faux.
Après std :: ws Ignore l'onglet, vous n'êtes pas EOF encore.
Si vous où attendre ce flux IO traiterait le commentaire de C comme espace blanc, ce n'est pas le cas.