C++ 使用boost::lexical\u cast捕获溢出

C++ 使用boost::lexical\u cast捕获溢出,c++,boost,C++,Boost,我想要捕捉boost::lexicat\u cast溢出,就像捕捉boost::numeric\u cast溢出一样。可能吗 下面的第一个try块抛出boost::numeric::negative\u溢出 第二个块不会抛出异常(这不是一个词法转换错误吗?) 尽管在下面的示例中使用了unsigned int,但我正在寻找一种适用于任何整数类型的方法 #include <boost/numeric/conversion/cast.hpp> #include <boost/lexi

我想要捕捉boost::lexicat\u cast溢出,就像捕捉boost::numeric\u cast溢出一样。可能吗

下面的第一个try块抛出boost::numeric::negative\u溢出

第二个块不会抛出异常(这不是一个词法转换错误吗?)

尽管在下面的示例中使用了unsigned 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;
}
#包括
#包括
int main()
{
无符号整数i;
尝试
{
int d=-23;
i=升压::数值型(d);
}
捕获(常量boost::numeric::错误的数值\u cast&e)
{

std::cout你可以用一点精神写出你想要的:

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

这不是一个bug;词法转换非常简单,文档建议您在需要更多控制的情况下使用stringstream。这样做很好!尽管它不能正常工作,并且对于数字字符串文本(例如数字词法转换(“123”);)也不会出错只需编写必要的重载。我尝试过,但无法编写字符串文字重载。请注意,如果您从解析器中删除
>eoi
,您可以使用
It&f
来检测有多少输入已被解析。我忘了删除其中的一些积垢,因此将
eoi
的检查移到此处迭代器重载到范围/sz重载。
 == input: 23 -> 23
 == input: -23 -> bad_numeric_lexical_cast