Я унаследовал шаблон для преобразования строки в числовое значение и хочу применить его для преобразования в boolean. Я не очень разбираюсь в классах stringstream и locale. Кажется, я получаю какое-то странное поведение, и мне интересно, может ли кто-нибудь объяснить это мне?num_get фасет и преобразование строки в boolean - сбой с инициализированным булевым?
template<typename T> T convertFromString(const string& str) const {
std::stringstream SStream(str);
T num = 0;
SStream >> num;
return num;
}
Это работает отлично, пока я пытаюсь логическое преобразование
string str1("1");
int val1 = convertFromString<int>(str1); // ok
string str2("true");
bool val2 = convertFromString<bool>(str2); // val2 is _false_
Я провел некоторое время, выслеживая проблему. Я подтвердил, что truename locale() возвращает «true».
Проблема, похоже, связана с инициализацией переменной num. Я могу сменить шаблон на это, и он работает:
template<typename T> T convertFromString(const string& str) const {
std::stringstream SStream(str);
T num; // <----------------------- Changed here
SStream >> num;
return num;
}
string str2("true");
bool val2 = convertFromString<bool>(str2); // val2 is _true_
Почему это работает? Я согласен с тем, что инициализация bool с «0» неверна, но почему это приведет к ошибке преобразования SStream>>num
?
Это имеет смысл. После публикации я извлек код из основного архива, чтобы проверить его сам, и он, похоже, сработал. Несогласованность, хотя, как вы говорите, является унифицированным логическим (в основном «истинным» в одном контексте, в основном «ложным» в другом). – youngthing
Благодарим вас за предоставление решения (boolalpha). – youngthing
Чтобы распознать строки true/false и 1/0, кажется, что полезно попробовать один, а затем попробовать другое, если это не удается: if ('(SStream >> num) .fail()) {SStream.Чисто(); SStream >> boolalpha >> Num; } – youngthing