How do I use boost::lexical_cast and std::boolalpha? i.e. boost::lexical_cast< bool>(“true”)

前端 未结 3 838
再見小時候
再見小時候 2020-12-30 01:25

I\'ve seen some answers to other boost::lexical_cast questions that assert the following is possible:

bool b = boost::lexical_cast< bool >         


        
相关标签:
3条回答
  • 2020-12-30 01:37

    I'm posting the answer to my own question here for others who may be looking for something like this:

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

    usage:

    #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;
    }
    
    0 讨论(0)
  • 2020-12-30 01:38

    In addition to the answer form poindexter, you can wrap the method from here in a specialized version of 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();
        }
    }
    

    And use it:

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

    I personally liked this approach because it hides any special code (e.g. using LocaleBool or to_bool(...) from the link) for converting to/from bools.

    0 讨论(0)
  • 2020-12-30 01:46

    Put together your own template on top of boost lexical cast for parsing. Note the "default" parameter in the example to ensure overloading works correctly (feel free to use another means if you want).

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

    Then, you can specialize for ANYTHING, including bools:

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

    Obviously there are a number of ways to do this, and you can add more conditions for true vs false (I'd make sure all variants of "TRUE" and "FALSE" like "True", plus "T" and "F" work right). You could even extend it to numeric parsing.

    0 讨论(0)
提交回复
热议问题