Инициализация bool с 0 надежно установит его в false, и это не повлияет на извлечение потока.
Проблема в том, что потоки по умолчанию распознают только значения 0
и 1
при работе с логическими значениями.Чтобы они могли распознавать имена true
и false
, вам нужно явно указать это потоку с манипулятором boolalpha
.
Лучший способ решить ваши проблемы - это специализировать шаблон для bool.:
template<> bool convertFromString<bool>( const string& str ) const {
std::stringstream SStream( str );
bool val = false;
SStream >> val;
if( SStream.fail() )
{
SStream.clear();
SStream >> boolalpha >> val;
}
return val;
}
Обратите внимание, что ваше изменение не заставило код работать.Похоже, это было сделано для одного тестового примера, который вы использовали.С вашим изменением функция не смогла прочитать из потока и вернула неинициализированное значение.Поскольку любое ненулевое значение будет интерпретировано как истина, функция, кажется, работает, но как только вы попытаетесь извлечь "false"
, вы увидите, что она не работает (функция по-прежнему возвращает истину).
Редактировать: Адаптирован код для обработки как числовых, так и буквенных значений.