Как мне использовать boost :: lexical_cast и std :: boolalpha?т.е. boost :: lexical_cast <bool>("true") - PullRequest
18 голосов
/ 15 декабря 2010

Я видел некоторые ответы на другие boost::lexical_cast вопросы, которые утверждают, что возможно следующее:

bool b = boost::lexical_cast< bool >("true");

Это не работает для меня с g ++ 4.4.3 boost 1.43. (Возможно, это правда, что он работает на платформе, где по умолчанию установлен std :: boolalpha)

Это является хорошим решением проблемы string to bool, но ему не хватает проверки ввода, которую обеспечивает boost :: lexical_cast.

Ответы [ 3 ]

16 голосов
/ 17 декабря 2010

Я публикую ответ на свой вопрос здесь для тех, кто ищет что-то вроде этого:

struct LocaleBool {
    bool data;
    LocaleBool() {}
    LocaleBool( bool data ) : data(data) {}
    operator bool() const { return data; }
    friend std::ostream & operator << ( std::ostream &out, LocaleBool b ) {
        out << std::boolalpha << b.data;
        return out;
    }
    friend std::istream & operator >> ( std::istream &in, LocaleBool &b ) {
        in >> std::boolalpha >> b.data;
        return in;
    }
};

использование:

#include <boost/lexical_cast.hpp>
#include <iostream>
#include "LocaleBool.hpp"

int main() {
    bool b = boost::lexical_cast< LocaleBool >("true");
    std::cout << std::boolalpha << b << std::endl;
    std::string txt = boost::lexical_cast< std::string >( LocaleBool( b ) );
    std::cout << txt << std::endl;
    return 0;
}
14 голосов
/ 17 июля 2013

В дополнение к указателю формы ответа, вы можете заключить метод из здесь в специализированную версию boost::lexical_cast:

namespace boost {
    template<> 
    bool lexical_cast<bool, std::string>(const std::string& arg) {
        std::istringstream ss(arg);
        bool b;
        ss >> std::boolalpha >> b;
        return b;
    }

    template<>
    std::string lexical_cast<std::string, bool>(const bool& b) {
        std::ostringstream ss;
        ss << std::boolalpha << b;
        return ss.str();
    }
}

И используйте это:

#include <iostream>
#include <boost/lexical_cast.hpp>

//... specializations

int main() {
    bool b = boost::lexical_cast<bool>(std::string("true"));
    std::cout << std::boolalpha << b << std::endl;
    std::string txt = boost::lexical_cast< std::string >(b);
    std::cout << txt << std::endl;

    return 0;
}

Мне лично понравился этот подход, потому что он скрывает любой специальный код (например, используя LocaleBool или to_bool(...) из ссылки) для преобразования в / из bools.

0 голосов
/ 22 октября 2013

Соберите свой собственный шаблон поверх лексического броска наддува для разбора. Обратите внимание на параметр «по умолчанию» в примере, чтобы обеспечить корректную перегрузку (не стесняйтесь использовать другое средство, если хотите).

template<typename T>
T Parse(const std::string& valStr, const T& default=T()) {
   T result = boost::lexical_cast<T>(valStr);
}

Затем вы можете специализироваться на НИЧЕМ, включая bools:

template<>
bool Parse(const std::string& valStr, const bool& default=true) {
   if(strcmp(valStr.c_str(), "true") == 0) {
       return true;
   }
   return false;
}

Очевидно, что есть несколько способов сделать это, и вы можете добавить больше условий для true против false (я бы удостоверился, что все варианты «TRUE» и «FALSE», такие как «True», плюс «T» и "F" работает правильно). Вы даже можете расширить его до числового анализа.

...