次のことが可能であると主張する他のboost::lexical_cast
の質問に対するいくつかの回答を見てきました。
bool b = boost::lexical_cast< bool >("true");
これは、g ++ 4.4.3ブースト1.43では機能しません。 (おそらく、std :: boolalphaがデフォルトで設定されているプラットフォームで動作するのは本当です)
This は、ブール値の問題に対する文字列の優れたソリューションですが、boost :: lexical_castが提供する入力検証が不足しています。
私はこのようなものを探しているかもしれない他の人のためにここに私自身の質問への答えを投稿しています:
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;
}
回答フォームの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(...)
を使用する)を隠すからです。
構文解析のためにブーストレキシカルキャストの上に独自のテンプレートをまとめます。正しく作品の過負荷を確保するための例では、「デフォルト」のパラメータに注意してください(あなたがしたい場合は、別の手段を使用して自由に感じます)。
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」を確認します)正しく動作します)。数値解析に拡張することもできます。