Преобразование из станд.:: представьте в виде строки к bool

Что является лучшим способом преобразовать станд.:: представить в виде строки к bool? Я вызываю функцию, которая возвращается или "0" или "1", и мне нужно чистое решение для того, чтобы превратить это в булево значение.

47
задан cquillen 29 January 2010 в 13:19
поделиться

10 ответов

Вероятно, для вас это будет перебор, но я бы использовал boost::lexical_cast

boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false
33
ответ дан 7 November 2019 в 12:50
поделиться

Я бы использовал это, что делает то, что вы хотите, и ловит случай ошибки.

bool to_bool(const std::string& x) {
  assert(x == "0" || x == "1");
  return x == "1";
}
3
ответ дан 7 November 2019 в 12:50
поделиться

Я бы изменил уродливую функцию, которая возвращает эту строку в первую очередь. Это то, для чего есть лол.

1
ответ дан 7 November 2019 в 12:50
поделиться

Попробуйте:

bool value;

if(string == "1")
    value = true;
else if(string == "0")
    value = false;
0
ответ дан 7 November 2019 в 12:50
поделиться

Вот путь, похожий на Кайл, кроме этого обрабатывает ведущие нули и вещи:

bool to_bool(std::string const& s) {
     return atoi(s.c_str());
}
0
ответ дан 7 November 2019 в 12:50
поделиться
bool to_bool(std::string const &string) { 
    return string[0] == '1';
}
0
ответ дан 7 November 2019 в 12:50
поделиться
bool to_bool(std::string const& s) {
     return s != "0";
}
45
ответ дан 7 November 2019 в 12:50
поделиться

Либо вы заботитесь о возможности неверного возвращаемого значения или нет. Большинство ответов до сих пор находятся в средней земле, ловит некоторые строки, кроме «0» и «1», возможно, рационализируют о том, как они должны быть преобразованы, возможно, бросая исключение. Неверный ввод не может производить действительный вывод, и вы не должны пытаться принять его.

Если вы не заботитесь о недействительных возврате, используйте S [0] == '1' . Это супер просто и очевидно. Если вы должны оправдать его толерантность к кому-то, скажите, что он преобразует неверный ввод в false, а пустая строка, скорее всего, будет один \ 0 в вашей реализации STL, поэтому она достаточно стабильна. S == «1» также хорош, но S! = «0» кажется тупой для меня и делает недействительным => правда.

Если вы заботитесь об ошибках (и, скорее всего, следует), используйте

if ( s.size() != 1
 || s[0] < '0' || s[0] > '1' ) throw input_exception();
b = ( s[0] == '1' );

Это ловит все ошибки, это также прямо очевидно и просто для любого, кто знает SMIDGEN C, и ничто не будет работать быстрее.

12
ответ дан 7 November 2019 в 12:50
поделиться

Написать свободную функцию:

bool ToBool( const std::string & s ) {
   return s.at(0) == '1';
}

Речь идет о самом простом, что может сработать, но вы должны спросить себя:

  • что должна возвращать пустая строка? версия выше бросает исключение
  • что должен преобразовывать символ, отличный от '1' или '0' в?
  • является ли строка, состоящая из более чем одного символа, допустимым входом для функции?

Я уверен, что есть и другие - это радость от дизайна API!

2
ответ дан 7 November 2019 в 12:50
поделиться

Вы всегда можете обернуть возвращаемую строку в класс, который обрабатывает концепцию булевых строк:

class BoolString : public string
{
public:
    BoolString(string const &s)
    :   string(s)
    {
        if (s != "0" && s != "1")
        {
            throw invalid_argument(s);
        }
    }

    operator bool()
    {
        return *this == "1";
    }
}

Вызовите что-нибудь вроде этого:

BoolString bs(func_that_returns_string());
if (bs) ...;
else ...;

, что бросит invalid_argument , если правило о "0" и "1" будет нарушено.

0
ответ дан 7 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: