2009-01-29 8 views
1

Se référant à C++ format macro/inline ostringstreammacro Inline ostringstream rechargées

La question était pour une macro qui permet concaténation en ligne d'objets pour créer une chaîne, iostream style.

La réponse était:

#define SSTR(x) dynamic_cast< std::ostringstream & >(\ 
     (std::ostringstream().seekp(0, std::ios_base::cur) << x) \ 
    ).str() 

Utilisation (par exemple):

throw std::runtime_error(
     SSTR("FooBar error: Value " << x << " exceeds " << y) 
); 

Cela fonctionne à merveille - avec GCC. Il compile et s'exécute sous Visual C++ 2005 aussi. Mais avec ce dernier, toutes les utilisations de la macro se traduisent par des chaînes vides, et je suis tout à fait stupéfait quant à pourquoi, et comment y remédier ...?

Répondre

2

Malheureusement, je n'ai pas accès à un compilateur MSVC à tester. Dans mes expériences passées avec les outils de Microsoft, il semble que Microsoft traite les définitions de langage et les normes comme un guide approximatif. (J'ai perdu beaucoup de temps sur des projets uniquement pour découvrir Microsoft tradition cassé avec quelque chose de simple comme C99.)

Compte tenu de cette situation regrettable, je vous suggère d'expérimenter une série de programmes triviaux. Des choses comme:

std::ostringstream() o; 
o.seekp(0, std::ios_base::cur) << "foo"; 
cout << "Test1: " << o << endl; 

Ou peut-être:

std::ostringstream() o; 
cout << "Test2: " << typeid(o).name() << endl; 
cout << "Test3: " << typeid(o.seekp(0, std::ios_base::cur)).name() << endl; 

Essayez de voir à quel point les choses ne fonctionnent plus. Ensuite, contournez le problème à partir de là. Seekp() était le coupable.

+0

Je ne sais pas ce que MSVC++ fait différemment avec cela, mais en remplaçant ostringstream(). Seekp (0, ios_base :: cabot) avec ostringstream() << std :: décembre (comme suggéré cadabra) fonctionne pour MSVC++ . J'ai laissé une note sur la question initiale pour que les autres ne soient pas pris en défaut. – DevSolar