conversion avec istringstream
Bonjour,
Dans une classe de type T j' ai une méthode qui convertit une string en types simples. Cela marche pour tous les types char, short, int, float, double, long double, sauf pour ...les string !
Exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
template < typename T >
class A
{ T g_val ;
public :
...
...
void setValue( const std::string& s )
{ std::istringstream is( s );
is >> g_val ;
}
} ; |
La convertion de string vers string s' arrête dès l' espace rencontré aprés les caractères.
Par exemple :
Code:
1 2 3 4 5 6 7 8
|
A<std::string> A( "hello world" ) ; =>ok normal
A.setValue("toto") ; ok
mais
A.setValue( "bonjour monde") ; erreur seul "bonjour" est traduit. |
Pourtant l' appel à std::istringstream.str() renvoît bien la chaîne entière.
Comment faire pour forcer le flux à renvoyer tous les caractères qu' il contient, y compris les espaces ?
Cordialement.
conversion avec istringstream
Bonjour,
Impossible de spécialiser, g_value est toujours de type T, ce qui pose problème dans un vecteur de classe de base .
bool A::setValue( const std::string& s ) est en fait dérivé d' une classe mère AA ;
Néanmoins j' ai trouvé une solution, peu esthétique, pour éviter l' echec de conversion de istringstream vers string.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
bool setValue( const std::string& s )
{ if( std::string("Ss") == std::string(typeid(T).name()) )
{ void * v1 = ( void * ) s.c_str() ;
g_val = *( T* ) &v1 ;
return true ;
}
std::string tmp ;
std::string::size_type i = s.find_last_not_of( ' ' );
if ( i != std::string::npos )
tmp = s.substr( 0, i + 1 ) ;
std::istringstream is( tmp );
T v1;
if ( ! ( is >> v1 ) || ! is.eof() ) return false ;
g_val = v1 ;
return true;
} |
Si vous avez une meilleure idée, n' hésitez pas.
Cordialement.