0

i/ostreamのビットシフトブールオーバーロードを置き換えたい。現在の実装では、「0」または「1」の入力文字列のみを取り込み、「0」または「1」のみを出力します。「t」、「true」、「f」、「false」などの他のシーケンスを考慮したブールオーバーロードを作成したい...限られた範囲に限定されている場合でも、これを行う方法はありますか?これは私が使用したいコードです:

inline std::ostream& operator << (std::ostream& os, bool b)
{
    return os << ( (b) ? "true" : "false" );
}

inline std::istream& operator >> (std::istream& is, bool& b)
{
    string s;
    is >> s;
    s = Trim(s);

    const char*  true_table[5] = { "t", "T", "true" , "True ", "1" };
    const char* false_table[5] = { "f", "F", "false", "False", "0" };

    for (uint i = 0; i < 5; ++i)
    {
        if (s == true_table[i])
        {
            b = true;
            return is;
        }
    }

    for (uint i = 0; i < 5; ++i)
    {
        if (s == false_table[i])
        {
            b = false;
            return is;
        }
    }

    is.setstate(std::ios::failbit);
    return is;
}
4

1 に答える 1

1

あなたがドロップすることをいとわないならt、そしてf可能性としてあなたはただ使うことができますstd::boolalphaそしてstd::noboolalpha

cppreferenceから:

// boolalpha output
std::cout << std::boolalpha 
          << "boolalpha true: " << true << '\n'
          << "boolalpha false: " << false << '\n';
std::cout << std::noboolalpha 
          << "noboolalpha true: " << true << '\n'
          << "noboolalpha false: " << false << '\n';
// booalpha parse
bool b1, b2;
std::istringstream is("true false");
is >> std::boolalpha >> b1 >> b2;
std::cout << '\"' << is.str() << "\" parsed as " << b1 << ' ' << b2 << '\n';

出力:

boolalpha true: true
boolalpha false: false
noboolalpha true: 1
noboolalpha false: 0
"true false" parsed as 1 0
于 2012-07-01T22:17:30.813 に答える