Es ist ziemlich unwahrscheinlich, dass der Compiler es schafft, die Umwandlung zu verwerfen, egal was passiert. Ausnahmen sind nur das Sahnehäubchen auf dem Kuchen. Wenn Sie dies optimieren wollen, müssen Sie einen eigenen Parser schreiben, um das Format für einen Float zu erkennen. Verwenden Sie Regexps oder parsen Sie manuell, da das Muster einfach ist:
if ( s.empty() ) return false;
string::const_iterator si = s.begin();
if ( *si == '+' || * si == '-' ) ++ si;
if ( si == s.end() ) return false;
while ( '0' <= *si && *si <= '9' && si != s.end() ) ++ si;
if ( si == s.end() ) return true;
if ( * si == '.' ) ++ si;
if ( ( * si == 'e' || * si == 'E' )
&& si - s.begin() <= 1 + (s[0] == '+') + (s[0] == '-') ) return false;
if ( si == s.end() ) return si - s.begin() > 1 + (s[0] == '+') + (s[0] == '-');
while ( '0' <= *si && *si <= '9' && si != s.end() ) ++ si;
if ( si == s.end() ) return true;
if ( * si == 'e' || * si == 'E' ) {
++ si;
if ( si == s.end() ) return false;
if ( * si == '-' || * si == '+' ) ++ si;
if ( si == s.end() ) return false;
while ( '0' <= *si && *si <= '9' && si != s.end() ) ++ si;
}
return si == s.end();
Nicht getestet Ich lasse Sie alle möglichen Formatkombinationen durchspielen ;v)
Edit: Beachten Sie auch, dass dies völlig unvereinbar mit der Lokalisierung ist. Sie haben absolut keine Hoffnung auf eine internationale Prüfung ohne Konvertierung.
Edit 2: Ups, ich dachte, das hätte schon jemand anderes vorgeschlagen. boost::lexical_cast
ist eigentlich täuschend einfach. Um zumindest zu vermeiden, dass die Ausnahme geworfen und aufgefangen wird, können Sie sie etwas umgestalten:
istringstream ss( s );
double d;
ss >> d >> ws; // ws discards whitespace
return ss && ss.eof(); // omit ws and eof if you know no trailing spaces
Dieser Code hingegen wurde getestet ;v)