C ++: использование boolalpha - PullRequest
0 голосов
/ 25 января 2011

Я использую функцию (TinyXML's TiXmlElement::QueryValueAttribute(const std::string &name, T * outValue), которая пытается прочитать строку в передаваемый тип данных. В моем случае я передаю bool. Поэтому я хочу использовать флаг boolalpha, чтобы ввод был true или false вместо 0 или 1.

Как мне это сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 января 2011

TiXmlElement::QueryValueAttribute использует std::istringstream для анализа значения. Таким образом, вы можете создать класс оболочки около bool, который перегружает operator >>, чтобы всегда устанавливать boolalpha перед извлечением:

class TinyXmlBoolWrapper
{
public:
    TinyXmlBoolWrapper(bool& value) : m_value(value) {}

    bool& m_value;
};

std::istream& operator >> (std::istream& stream, TinyXmlBoolWrapper& boolValue)
{
    // Save the state of the boolalpha flag & set it
    std::ios_base::fmtflags fmtflags = stream.setf(std::ios_base::boolalpha);
    std::istream& result = stream >> boolValue.m_value;
    stream.flags(fmtflags);  // restore previous flags
    return result;
}

...

bool boolValue;
TinyXmlBoolWrapper boolWrapper(boolValue);
myTinyXmlElement->QueryAttribute("attributeName", &boolWrapper);
// boolValue now contains the parsed boolean value with boolalpha used for
// parsing
0 голосов
/ 25 января 2011

Вы можете использовать строковое значение для создания потока istringstream, а затем передать его в вашу переменную * T. Аспекты ввода / вывода проиллюстрированы ниже.

#include <iostream>                                                             
#include <iomanip>                                                              
#include <sstream>                                                              

int main()                                                                      
{                   
    // output example                                                            
    std::cout << std::boolalpha << true << ' ' << false << '\n';

    // input example                
    std::istringstream iss("true false");                                       
    bool x = false, y = true;                                                   
    iss >> x >> y;                                                              
    std::cout << std::boolalpha << x << ' ' << y << '\n';                       
}
...