gpt4 book ai didi

c++ - 解析未知类型的数字字符串?

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:07 26 4
gpt4 key购买 nike

当事先不知道目标类型时,将 std::string 解析为 C++ 中的某些数字类型的最佳方法是什么?

我看过lexical_cast ,但是它将目标类型作为模板参数。我可以通过捕获 bad_lexical_cast 并返回 false 来编写滥用它的包装函数,但这看起来很难看。

我的输入值通常是 intfloat 并且具有极其简单的格式,但是灵活的东西会很棒!

最佳答案

您可以使用 Boost Spirit Numerical Parsers或(滥用)使用 Boost Lexicalcast。

Boost Spirit 允许您对接受的格式进行细粒度控制,参见示例

这是一个快速演示,它还展示了如何检测几种可能的数字输入格式(渐进式)并返回匹配的类型。当然,这可能有点矫枉过正,但它应该演示如何进一步使用 Spirit。

该演示还展示了如何推进输入迭代器,以便您可以轻松地继续解析数字输入结束的位置。

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

关于c++ - 解析未知类型的数字字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9358096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com