21

私はboost::lexical_cast、次のことが可能であると主張する他の質問に対するいくつかの答えを見てきました。

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

これは、g ++ 4.4.3Boost1.43では機能しません。std::boolalpha(おそらく、デフォルトで設定されているプラ​​ットフォームで動作するのは事実です)

これはブール値の問題に対する文字列の優れた解決策ですが、boost::lexical_castが提供する入力検証が欠けています。

4

3 に答える 3

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

利用方法:

#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;
}
于 2010-12-17T20:21:41.603 に答える
16

回答フォームのpoindexterに加えて、ここからメソッドを特殊なバージョンの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;
}

私は個人的にこのアプローチが好きでした。なぜなら、boolとの間で変換するための特別なコード(たとえば、リンクを使用しLocaleBoolたり、リンクから)を隠してしまうからです。to_bool(...)

于 2013-07-17T19:43:14.633 に答える
0

構文解析のためにブーストレキシカルキャストの上に独自のテンプレートをまとめます。オーバーロードが正しく機能するように、例の「デフォルト」パラメーターに注意してください(必要に応じて別の手段を使用してください)。

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」などの「TRUE」と「FALSE」のすべてのバリアントに加えて、「T」と「F」を確認します)正しく動作します)。数値解析に拡張することもできます。

于 2013-10-22T16:14:30.633 に答える