2012-07-01 2 views
0

Я хочу заменить перегрузку boolbift bool для i/ostream. Текущая реализация принимает только входные строки «0» или «1» и выводит только «0» или «1». Я хочу сделать перегрузку bool, которая учитывает другие последовательности, такие как «t», «true», «f», «false» и т. Д.. Есть ли способ сделать это, даже если он ограничен ограниченным объемом? Это код, который я хочу использовать:replace o/istream bool bithift operator

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; 
} 

ответ

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 
+0

является определением от boolalpha отличается с каждой реализацией? – Jim

+0

@ Jim No. 654321 – David

Смежные вопросы