Подтвердить что ты не робот

Преобразование из std::string в bool

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

4b9b3361

Ответ 1

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

boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false

Ответ 2

Я удивлен, что никто не упомянул об этом:

bool b;
istringstream("1") >> b;

или

bool b;
istringstream("true") >> std::boolalpha >> b;

Ответ 3

bool to_bool(std::string const& s) {
     return s != "0";
}

Ответ 4

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

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

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

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

Это ловит ВСЕ ошибки, они также явно очевидны и просты для всех, кто знает smidgen C, и ничего не будет выполняться быстрее.

Ответ 5

Существует также std:: stoi в С++ 11:

bool value = std:: stoi (someString.c_str());

Ответ 6

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

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

Это про самую простую вещь, которая может работать, но вам нужно спросить себя:

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

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

Ответ 7

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

bool to_bool(const std::string& x) {
  assert(x == "0" || x == "1");
  return x == "1";
}

Ответ 8

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

Ответ 9

Попробуйте следующее:

bool value;

if(string == "1")
    value = true;
else if(string == "0")
    value = false;

Ответ 10

bool to_bool(std::string const &string) { 
    return string[0] == '1';
}

Ответ 11

Здесь способ, подобный Кайлу, кроме него обрабатывает ведущие нули и прочее:

bool to_bool(std::string const& s) {
     return atoi(s.c_str());
}

Ответ 12

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

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".

Ответ 13

Ответ DavidL - лучший, но я хочу поддерживать обе формы логического ввода одновременно. Итак, небольшая вариация на тему (названа в честь std::stoi):

bool stob(std::string s, bool throw_on_error = true)
{
    auto result = false;    // failure to assert is false

    std::istringstream is(s);
    // first try simple integer conversion
    is >> result;

    if (is.fail())
    {
        // simple integer failed; try boolean
        is.clear();
        is >> std::boolalpha >> result;
    }

    if (is.fail() && throw_on_error)
    {
        throw std::invalid_argument(s.append(" is not convertable to bool"));
    }

    return result;
}

Это поддерживает "0", "1", "true" и "false" в качестве допустимых входных данных. К сожалению, я не могу найти портативный способ также поддерживать "TRUE" и "FALSE"