Компилятору вряд ли удастся выбросить преобразование, несмотря ни на что.Исключение составляют только глазурь на торте.Если вы хотите оптимизировать это, вам придется написать свой собственный синтаксический анализатор, чтобы распознать формат для числа с плавающей точкой.Используйте регулярные выражения или синтаксический анализ вручную, так как шаблон прост:
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();
Не проверено ... Я позволю вам просмотреть все возможные комбинации форматов; v)
Редактировать: Также обратите вниманиечто это совершенно несовместимо с локализацией.У вас абсолютно нет надежды на международную проверку без конвертации.
Редактировать 2: Упс, я думал, что кто-то другой уже предложил это.boost::lexical_cast
на самом деле обманчиво прост.Чтобы, по крайней мере, избежать создания или перехвата исключения, вы можете переопределить его несколько:
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
Этот код, с другой стороны, был проверен; v)