ブーストスピリットNumerical Parsersまたは(ab)ブーストレキシカルキャストを使用できます。
ブーストスピリットは、許容されるフォーマットをきめ細かく制御できるようにします。ここで
また、あなたがいくつかの可能な数値の入力フォーマット(徐々に)を検出し、マッチしたタイプを返すことができる方法を示して、迅速なデモです。もちろんそれは過度のものかもしれませんが、スピリットをさらにどのように使うべきかを示すべきです。
デモでは、入力イテレータを進めて、数値入力が終了した場所での解析を簡単に続ける方法も示しています。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
enum numeric_types
{
fmt_none,
fmt_float,
fmt_double,
fmt_uint,
fmt_int,
// fmt_hex, etc.
};
template <typename It>
bool is_numeric(It& f, It l, numeric_types& detected)
{
return qi::phrase_parse(f,l,
qi::uint_ [ qi::_val = fmt_uint ]
| qi::int_ [ qi::_val = fmt_int ]
| qi::float_ [ qi::_val = fmt_float ]
| qi::double_ [ qi::_val = fmt_double ]
,qi::space, detected);
}
template <typename It>
bool is_numeric(It& f, It l)
{
numeric_types detected = fmt_none;
return is_numeric(f, l, detected);
}
int main()
{
const std::string input = "124, -25, 582";
std::string::const_iterator it = input.begin();
bool ok = is_numeric(it, input.end());
if (ok)
{
std::cout << "parse success\n";
if (it!=input.end())
std::cerr << "trailing unparsed: '" << std::string(it,input.end()) << "'\n";
}
else
std::cerr << "parse failed: '" << std::string(it,input.end()) << "'\n";
return ok? 0 : 255;
}
例外をキャッチすることは悪用だと思いますが、btwですが、タイプごとに*を書くことはしません。むしろ、すべての許可されたフォーマットを試みる単一の機能を持っています。例外は、文字列が予想される形式と一致しないことを示す完全に合理的な方法です。適切なフォーマットを知らないことを知っている関数の外に決して伝播する必要はなく、いくつかの異なるフォーマットを順番に試して「リスクを冒す」必要があります。 –