Estoy tratando de escribir una macro que me permita hacer algo como: FORMAT(a << "b" << c << d)
, y el resultado sería una cadena - lo mismo que crear un ostringstream, insertar a...d
, y devolver .str()
. Algo como:C++ formato macro/inline ostringstream
string f(){
ostringstream o;
o << a << "b" << c << d;
return o.str()
}
Esencialmente, FORMAT(a << "b" << c << d) == f()
.
En primer lugar, he intentado:
1: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << items)).str()
Si el primer elemento es una cadena C (const char *
), se imprimirá la dirección de la cadena en hexadecimal, y los siguientes artículos se imprimirá bien. Si el primer elemento es std::string
, no se compilará (no se aplica el operador <<
).
Este:
2: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << 0 << '\b' << items)).str()
da lo que parece ser la salida derecha, pero el 0
y \b
están presentes en la cadena, por supuesto.
El siguiente parece funcionar, pero compila con las advertencias (tomando la dirección del temporal):
3: #define FORMAT(items) \
((std::ostringstream&)(*((std::ostream*)(&std::ostringstream())) << items)).str()
¿alguien sabe por qué 1 imprime la dirección de la c-secuencia y falla al compilar con el std::string
? ¿No son 1 y 3 esencialmente lo mismo?
Sospecho que las plantillas variadic de C++ 0x harán posible format(a, "b", c, d)
. Pero, ¿hay alguna manera de resolver esto ahora?
Rechazaré el primer párrafo, pero no toda la respuesta. –
Gracias, eso es muy informativo. No he usado Boost mucho, es interesante ver lo que hay allí. – cadabra
¿Por qué no se puede unir? –