代码之家  ›  专栏  ›  技术社区  ›  Lior Kogan

使用boost::u cast捕获溢出

  •  1
  • Lior Kogan  · 技术社区  · 7 年前

    我想抓住你 助推::助推 溢出。有可能吗?

    尝试 下面的块抛出一个 boost::numeric::负\u溢出

    第二个块不会抛出异常(这不是 臭虫?)

    在下面的示例中使用,我正在寻找一个可以用于任何整数类型的方法。

    #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;
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   sehe    7 年前

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

    Live On Coliru

    #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