from ejemplo c++ visual-c++ macros ostringstream

c++ - ejemplo - Macro en línea de avestruz recargados



get string from ostringstream (1)

Lamentablemente, no tengo acceso a un compilador MSVC para probar en contra.

En mis experiencias pasadas con las herramientas de Microsoft, parece que Microsoft trata las definiciones y los estándares del lenguaje como poco más que una guía aproximada. (He perdido mucho tiempo en proyectos solo para descubrir la tradición de Microsoft rompió con algo tan básico como C99).

Dada esta situación lamentable, le sugiero que experimente con una serie de programas triviales. Cosas como:

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

O quizás:

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

Intenta ver en qué punto las cosas dejan de funcionar. Luego resuelve el problema desde allí.

Refiriéndose al formato C ++ macro / inline ostringstream

La pregunta que había para una macro que permite la concatenación de objetos en línea para crear una cadena, iostream-style.

La respuesta fue:

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

Uso (por ejemplo):

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

Eso funciona maravillosamente, con GCC. Se compila y se ejecuta en Visual C ++ 2005 también. Pero con este último, todos los usos de la macro dan como resultado cadenas vacías, y estoy completamente atónito sobre por qué, y cómo solucionarlo ...