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