2010-12-15 20 views
17

は、私は次のことを主張し、他のboost::lexical_cast質問にいくつかの答えを見てきました< bool >(「真」)のlexical_castすなわちブーストが::可能です:boost :: lexical_castとstd :: boolalphaはどうやって使うのですか?

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

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

Thisは文字列をブールにするうまい解決策ですが、boost :: lexical_castが提供する入力検証はありません。

+4

あなた自身の質問への回答の投稿に関する意見は混在していますが、回答は回答として投稿してください。 – robert

+3

回答**を回答**として投稿してください。 –

+0

編集中! (何らかの理由であなたのコメントが電子メールで送られてきませんでした) – poindexter

答えて

15

私はこのような何かを探している可能性があり、他人のために、ここで自分の質問への答えを投稿しています:

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

BTW- 'operator >>'や 'operator <<'で受け取ったストリームで 'std :: boolalpha'を使うのは良いスタイルですか?慣習によって関数がストリームを同じ状態にすることは想定されていないのですか? – Kos

+1

おっと!正気を維持するために、iostreamsにboost :: ios_flags_saverを使用することができます。 – poindexter

+0

実際には、私はそれについてもっと考えます。 LocaleBoolの抽出/挿入演算子をboost :: lexical_castの外側で使用することを意図している場合にのみ、ストリームの状態を尊重したいと思うでしょう。実際のI/Oに使用されているiostreamと混用してはならないという警告が付いているので、ほとんどの場合、正常であるはずです。 – poindexter

10

を解答フォームポインデクスターに加えて、メソッドhereから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(...)を使用してください)。

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"、さらに "T"と "F"のように正しく動作することを確認してください。数値解析にも拡張できます。

関連する問題