fmt
Primeros pasos con fmt: posiciones, precisión y un tipo propio pequeño
Prepara un ejemplo C++20, separa errores literales y dinámicos, y extiende un tipo con format_as reutilizando una representación existente.
Qué aprenderás
- Empieza con una salida determinista
- Decide cuándo debe fallar
- Extiende la representación antes que la sintaxis
Antes de empezar
- Valores, referencias, cadenas y destinos de construcción en C++
- Distinguir expectativas documentadas de resultados medidos
Traza comportamientos concretos de fmt y elige una integración con límites explícitos de salida, vida útil y verificación.
Conclusiones clave
- Los campos posicionales permiten reordenar mensajes sin cambiar el significado de los argumentos.
- Los formatos literales y dinámicos necesitan pruebas de error distintas.
- format_as reutiliza una representación; un formatter propio asume un contrato más amplio.
Empieza con una salida determinista
Usa un programa pequeño de C++20 que incluya fmt/format.h y enlace la dependencia fijada. El ejemplo usa el segundo argumento como etiqueta y presenta el primero con dos decimales. El resultado esperado es value: 1.23. Esa aserción comprueba la API necesaria sin añadir escrituras de archivos, entradas remotas ni un framework de registros ajeno.
Los campos usan llaves y los dos puntos introducen la presentación. Referencias explícitas como {1} y {0:.2f} permiten reordenar valores en mensajes traducidos conservando su significado. No mezcles indexación numérica automática y explícita en una misma cadena. Las llaves literales se duplican; la gramática no equivale a los especificadores de printf.
Decide cuándo debe fallar
Con las comprobaciones consteval de C++20 soportadas, una cadena usada como argumento de una presentación decimal entera literal produce un error de compilación. Envolver ese formato en fmt::runtime traslada la validación a la ejecución, donde la configuración habitual con excepciones puede lanzar fmt::format_error. Son pruebas distintas, no evidencia de que la entrada dinámica ya estuviera validada.
La gramática permite anchura y precisión dinámicas mediante argumentos. Un tipo entero válido no establece un límite de tamaño apropiado para tu aplicación. Mantén valores pequeños en el ejercicio inicial y añade un caso negativo de tipos. Si un literal incorrecto compila, revisa versión, modo de lenguaje y FMT_USE_CONSTEVAL antes de modificar la aserción.
Extiende la representación antes que la sintaxis
Si un valor de dominio debe presentarse igual que otro tipo existente, define format_as en su mismo espacio de nombres. La prueba complementaria convierte un objeto con el entero 7 a su representación entera y comprueba el relleno 0007. Reutiliza las reglas de números de la biblioteca en vez de implementar un analizador nuevo.
Una especialización de formatter es adecuada cuando necesitas control propio del análisis o de la representación. La documentación recomienda heredar o componer un formatter existente cuando sea posible. Añadir simultáneamente mecanismos de extensión que compiten no simplifica el contrato: elige uno y prueba alineación, anchura y entradas inválidas.
Pasos de implementación
- 1
Crea un destino C++20 enlazado al código fijado.
- 2
Comprueba exactamente la salida de posiciones y precisión.
- 3
Separa el literal inválido en una compilación cuyo fallo sea esperado.
- 4
Añade una conversión de dominio pequeña y comprueba su resultado.
Ejemplo para copiar
#include <fmt/format.h>
#include <cassert>
int main() {
const auto result = fmt::format("{1}: {0:.2f}", 1.234, "value");
assert(result == "value: 1.23");
}Preguntas frecuentes
¿Puedo mezclar índices numéricos automáticos y explícitos?
No. Mantén un modo de indexación consistente dentro de cada formato, como explica la sintaxis de la revisión fijada.
¿fmt::runtime evita la validación?
Cambia su momento. No garantiza que una presentación inválida funcione ni que una anchura arbitraria sea apropiada.
Fuentes
- doc/get-started.mdFuente verificada 2026-09-08
- doc/api.mdFuente verificada 2026-09-08
- doc/syntax.mdFuente verificada 2026-09-08
- include/fmt/core.hFuente verificada 2026-09-08
- include/fmt/format.hFuente verificada 2026-09-08
- test/format-test.ccFuente verificada 2026-09-08