Std :: stringをboolに変換する最良の方法は何ですか? 「0」または「1」を返す関数を呼び出していますが、これをブール値に変換するためのクリーンなソリューションが必要です。
おそらくあなたにとってはやりすぎでしょうが、私は boost :: lexical_cast を使用します
boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false
私は誰もこれについて言及していないことに驚いています:
bool b;
istringstream("1") >> b;
または
bool b;
istringstream("true") >> std::boolalpha >> b;
bool to_bool(std::string const& s) {
return s != "0";
}
無効な戻り値の可能性を気にするか、気にしません。これまでのほとんどの答えは中途半端で、「0」と「1」以外のいくつかの文字列をキャッチし、おそらく変換する方法を合理化し、おそらく例外をスローします。 無効な入力は有効な出力を生成できないため、受け入れようとしないでください。
無効な返品を気にしない場合は、s[0] == '1'
。それは非常にシンプルで明白です。誰かにその許容範囲を正当化する必要がある場合、無効な入力をfalseに変換し、空の文字列は単一の\0
をSTL実装で使用しているため、かなり安定しています。 s == "1"
も良いですが、s != "0"
は私には鈍感で、無効=> trueにします。
エラーを気にする場合(そして、そうすべきである場合)、
if ( s.size() != 1
|| s[0] < '0' || s[0] > '1' ) throw input_exception();
b = ( s[0] == '1' );
これはすべてのエラーをキャッチします。また、Cのsmidgenを知っている人にとっては率直に言って明白で単純であり、何も速く実行されません。
C++ 11にはstd :: stoiもあります:
bool value = std :: stoi(someString.c_str());
私はこれを使用しますが、これはあなたが望むことを行い、エラーケースをキャッチします。
bool to_bool(const std::string& x) {
assert(x == "0" || x == "1");
return x == "1";
}
無料の関数を書く:
bool ToBool( const std::string & s ) {
return s.at(0) == '1';
}
これは動作する可能性のある最も簡単なものですが、自分で確認する必要があります。
他にもあるはずです-これがAPIデザインの喜びです!
最初にこの文字列を返すreturnsい関数を変更します。それがboolの目的です。
DavidLの答え が最適ですが、同時にboth形式のブール入力をサポートしたいと思っています。テーマのマイナーバリエーション( 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」もサポートする移植可能な方法がわかりません
これは、先頭のゼロなどを処理することを除いて、Kyleの方法と似ています。
bool to_bool(std::string const& s) {
return atoi(s.c_str());
}
これを試して:
bool value;
if(string == "1")
value = true;
else if(string == "0")
value = false;
bool to_bool(std::string const &string) {
return string[0] == '1';
}
返された文字列は、ブール文字列の概念を処理するクラスで常にラップできます。
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"
に違反しています。