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
shortundunsigned shortals Parameter fürlexical_castfunktionieren, aber wedercharnochunsigned 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<>? Oderboost::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 Funktiontemplate<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 charundunsigned charsind drei verschiedene Typen!).
-
@hustbaer
Ui, wusste ich noch nicht, danke. In meinem Fall geht es um die Konvertierung aus/in einenOleVariant, da gibt es den Datentypsigned charaber nicht. Bzw die Konvertierung benutzt nurcharundunsigned char.