Что является лучшим способом преобразовать станд.:: представить в виде строки к bool? Я вызываю функцию, которая возвращается или "0" или "1", и мне нужно чистое решение для того, чтобы превратить это в булево значение.
Вероятно, для вас это будет перебор, но я бы использовал boost::lexical_cast
boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false
Я бы использовал это, что делает то, что вы хотите, и ловит случай ошибки.
bool to_bool(const std::string& x) {
assert(x == "0" || x == "1");
return x == "1";
}
Я бы изменил уродливую функцию, которая возвращает эту строку в первую очередь. Это то, для чего есть лол.
Попробуйте:
bool value;
if(string == "1")
value = true;
else if(string == "0")
value = false;
Вот путь, похожий на Кайл, кроме этого обрабатывает ведущие нули и вещи:
bool to_bool(std::string const& s) {
return atoi(s.c_str());
}
bool to_bool(std::string const &string) {
return string[0] == '1';
}
bool to_bool(std::string const& s) {
return s != "0";
}
Либо вы заботитесь о возможности неверного возвращаемого значения или нет. Большинство ответов до сих пор находятся в средней земле, ловит некоторые строки, кроме «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, и ничто не будет работать быстрее.
Написать свободную функцию:
bool ToBool( const std::string & s ) {
return s.at(0) == '1';
}
Речь идет о самом простом, что может сработать, но вы должны спросить себя:
Я уверен, что есть и другие - это радость от дизайна API!
Вы всегда можете обернуть возвращаемую строку в класс, который обрабатывает концепцию булевых строк:
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"
будет нарушено.