boost::lexical_cast -> boost::bad_cast_exception



  • Hi zusammen,

    hat jemand eine Erklärung dafür, warum boost (V1.55) hier eine bad_lexical_cast Exception wirft?

    #include <boost/lexical_cast.hpp>
    int main()
    {
       int i1 = boost::lexical_cast<int>( (char) 1 ); // exception
       int i2 = boost::lexical_cast<int>( (unsigned char) 1 ); // exception
       int i3 = boost::lexical_cast<int>( (short) 1 ); // ok
    }
    

    Edit short und unsigned short als Parameter für lexical_cast funktionieren, aber weder char noch unsigned char.



  • Was soll das denn jetzt casten? String to Number?



  • Das liegt wohl an "Because lexical_cast behaves as if the conversion is done via a stringstream, and operator>> for signed char reads characters, not numbers.", s. boost::lexical_cast<signed char> cannot handle negative numbers?
    Es ist ja hauptsächlich für String<->Zahlen-Konvertierungen gedacht.

    Warum verwendest du denn nicht einen einfachen static_cast<>? Oder boost::numeric_cast<>?



  • @manni66
    Nö, das soll char nach int casten. Tritt so explizit in meinem Code nicht auf, aber ich habe eine template Funktion mit T und U, die ggf. auch von/nach string casten soll. Und bei char -> int schepperts.

    Edit:
    Ich habe eine Funktion

    template<typename T, typename U>
    T convert( U const& value )
    {
       return boost::lexical_cast<T>( value );
    }
    

    Weiter im Quelltext:

    template<typename T>
    void f( SomeType& var, T const& T val )
    {
       if( var.DataType == DataType::Boolean ) var.Value = convert<bool,T>( val );
       else if( var.DataType == DataType::Signed8 ) var.value = convert<char,T>( val );
       ...
    }
    

    }
    Edit:
    Mein Workaround sieht jetzt so aus:

    template<typename T> struct LexicalCastTraits
    {
       using Type = T;
    };
    
    template<> struct LexicalCastTraits<char>
    {
       using Type = short;
    }:
    
    template<> struct LexicalCastTraits<unsigned char>
    {
       using Type = unsigned short;
    };
    
    template<typename T, typename U>
    T convert( U const& val )
    {
       return boost::lexical_cast<T>( static_cast<typename LexicalCastTraits<U>::Type>( val ) );
    }
    

    void



  • Da fehlt noch eine Spezialisierung für signed char (char, signed char und unsigned char sind drei verschiedene Typen!).



  • @hustbaer
    Ui, wusste ich noch nicht, danke. In meinem Fall geht es um die Konvertierung aus/in einen OleVariant, da gibt es den Datentyp signed char aber nicht. Bzw die Konvertierung benutzt nur char und unsigned char.


Log in to reply