我如何使用boost :: lexical_cast和std :: boolalpha?即boost :: lexical_cast <bool>("true")

poi*_*ter 20 c++ string boost lexical-cast

我已经看到了其他boost::lexical_cast问题的一些答案,断言以下是可能的:

bool b = boost::lexical_cast< bool >("true");
Run Code Online (Sandbox Code Playgroud)

这对g ++ 4.4.3 boost 1.43不起作用.(也许它确实适用于默认情况下设置std :: boolalpha的平台)

是字符串到bool问题的一个很好的解决方案,但它缺少boost :: lexical_cast提供的输入验证.

poi*_*ter 16

我在这里发布了我自己的问题的答案,其他人可能正在寻找这样的事情:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

用法:

#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;
}
Run Code Online (Sandbox Code Playgroud)


小智 14

除了问答形式波因德克斯特,则可以从包装方法这里在一个专门的版本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();
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我个人很喜欢这种方法,因为它隐藏了任何特殊代码(例如使用LocaleBoolto_bool(...)来自链接)以转换为bool或从bools转换.