使用提升::lexical_cast捕获溢出

Catching overflows with boost::lexical_cast

本文关键字:cast 溢出 lexical      更新时间:2023-10-16

我想捕获boost::lexicat_cast溢出,就像我可以捕获boost::numeric_cast溢出一样。可能吗?

下面的第一个尝试块抛出一个提升::数字::negative_overflow

第二个块不会抛出异常(这不是lexical_cast错误吗?

虽然在下面的示例中使用了无符号 int,但我正在寻找一种适用于任何整数类型的方法。

#include <boost/numeric/conversion/cast.hpp>
#include <boost/lexical_cast.hpp>
int main()
{
unsigned int i;
try
{
int d =-23;
i = boost::numeric_cast<unsigned int>(d);
}
catch (const boost::numeric::bad_numeric_cast& e)
{
std::cout << e.what() << std::endl;
}
std::cout << i << std::endl; // 4294967273
try
{
char c[] = "-23";
i = boost::lexical_cast<unsigned int>(c);
}
catch (const boost::bad_lexical_cast& e)
{
std::cout << e.what() << std::endl;
}
std::cout << i << std::endl; // 4294967273
return 0;
}

你可以用一点精神来写你想要的东西:

住在科里鲁

#include <boost/spirit/include/qi.hpp>
#include <iostream>
template <typename Out, typename In> Out numeric_lexical_cast(In const& range) {
Out value;
{
using namespace boost::spirit::qi;
using std::begin;
using std::end;
if (!parse(begin(range), end(range), auto_ >> eoi, value)) {
struct bad_numeric_lexical_cast : std::domain_error {
bad_numeric_lexical_cast() : std::domain_error("bad_numeric_lexical_cast") {}
};
throw bad_numeric_lexical_cast();
}
}
return value;
}
int main()
{
for (std::string const& input : { "23", "-23" }) try {
std::cout << " == input: " << input << " -> ";
auto i = numeric_lexical_cast<unsigned int>(input);
std::cout << i << std::endl;
} catch (std::exception const& e) {
std::cout << e.what() << std::endl;
}
}

指纹

== input: 23 -> 23
== input: -23 -> bad_numeric_lexical_cast