2010-06-04 14 views
5

Estoy tratando de usar especificadores de anchura y precisión con boost::format, así:* Ancho de precisión y especificadores Con impulso :: formato

#include <boost\format.hpp> 
#include <string> 

int main() 
{ 
    int n = 5; 
    std::string s = (boost::format("%*.*s") % (n*2) % (n*2) % "Hello").str(); 
    return 0; 
} 

Pero esto no funcionará porque boost::format no es compatible con el * especificador. Boost lanza una excepción al analizar la cadena.

¿Hay alguna forma de lograr el mismo objetivo, preferiblemente utilizando un reemplazo directo?

Respuesta

8

Prueba esto:

#include <boost/format.hpp> 
#include <iomanip> 

using namespace std; 
using namespace boost; 

int main() 
{ 
    int n = 5; 
    string s = (format("%s") % io::group(setw(n*2), setprecision(n*2), "Hello")).str(); 
    return 0; 
} 

grupo () le permite encapsular uno o más manipuladores con un parámetro.

+0

Esto es lo que fui con, pero estoy tratando de hacer esto de otra manera, también. Ver aquí: http://stackoverflow.com/questions/2981724/boostfunction-boostlambda-again –

+1

Por cierto, gracias por dirigirme a 'agrupación: –

+0

Cuando se aplica a las cadenas,' setprecision' se ignora en 'format', al igual que es durante la E/S corriente ordinaria. –

2

Bueno, esto no es un drop-in, pero una forma de hacerlo sería para construir la cadena de formato de forma dinámica:

#include <boost/format.hpp> 
#include <boost/lexical_cast.hpp> 

int main() 
{ 
    int n = 5; 
    const std::string f("%" + 
         boost::lexical_cast<std::string>(n * 2) + "." + 
         boost::lexical_cast<std::string>(n * 2) + "s"); 
    std::string s = (boost::format(f) % "Hello").str(); 
} 

Por supuesto, si se hizo esto con frecuencia, podría refactorizar la construcción de la cadena de formato en una función.

También puede usar boost::format() para generar la cadena de formato; es más corto, pero potencialmente menos legible, especialmente para las cadenas de formato largo:

const std::string f = (boost::format("%%%d.%ds") % (n*2) % (n*2)).str(); 
std::string s = (boost::format(f) % "Hello").str(); 

(crédito para Ferruccio por publicar la segunda idea en los comentarios)

+0

Sí, esta es hasta ahora la mejor alternativa que he podido encontrar. Como habrás imaginado, estoy refaccionando el código anterior. Algunas de estas cadenas son súper complejas, y hacerlo de esta manera funcionaría, pero sería muy difícil. 1 de todas formas –

+3

Por qué no usar boost :: formato para generar la cadena de formato, así? es decir, std :: string f = (boost :: formato ("%%% d% ds")% n * 2% n * 2) .str(); – Ferruccio

Cuestiones relacionadas