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
undunsigned short
als Parameter fürlexical_cast
funktionieren, aber wederchar
nochunsigned 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 char
undunsigned char
sind 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 char
aber nicht. Bzw die Konvertierung benutzt nurchar
undunsigned char
.