web-dev-qa-db-ja.com

boost :: lexical_castとstd :: boolalphaを使用するにはどうすればよいですか?つまり、boost :: lexical_cast <bool>( "true")

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

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

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

This は、ブール値の問題に対する文字列の優れたソリューションですが、boost :: lexical_castが提供する入力検証が不足しています。

20
poindexter

私はこのようなものを探しているかもしれない他の人のためにここに私自身の質問への答えを投稿しています:

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

回答フォームの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(...)を使用する)を隠すからです。

14
womple

構文解析のためにブーストレキシカルキャストの上に独自のテンプレートをまとめます。正しく作品の過負荷を確保するための例では、「デフォルト」のパラメータに注意してください(あなたがしたい場合は、別の手段を使用して自由に感じます)。

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」を確認します)正しく動作します)。数値解析に拡張することもできます。

0
Zack Yezek