fmt para C++: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a la biblioteca fmt para C++

\n\n

La biblioteca fmt (o fmtlib) es una biblioteca moderna, rápida y segura para formatear cadenas en C++. Proporciona una alternativa a funciones obsoletas como printf y sprintf, así como a los engorrosos flujos std::stringstream. El objetivo principal de fmt es hacer que el formateo de cadenas sea simple, seguro en cuanto a tipos, extensible y eficiente.

\n\n

¿Por qué se necesita fmt? En primer lugar, resuelve el problema de la seguridad de tipos. printf no verifica los tipos de los argumentos, lo que provoca comportamientos indefinidos y errores difíciles de detectar. fmt, en cambio, utiliza plantillas de C++ y verifica los tipos en tiempo de compilación. En segundo lugar, fmt es significativamente más rápido que std::stringstream y, a menudo, más rápido que printf. En tercer lugar, su sintaxis es intuitiva y recuerda al formateo en Python, lo que facilita la transición entre lenguajes. Tanto es así, que fmt se convirtió en la base de std::format, que fue adoptado en el estándar C++20.

\n\n

En este sitio, pythonlib.ru, a menudo hablamos de Python, pero fmt es un excelente ejemplo de cómo las buenas ideas de Python migraron al mundo de C++ y se convirtieron en un estándar de facto allí. Si programas en C++ y quieres hacerlo de manera moderna, fmt es una biblioteca obligatoria en tu arsenal.

\n\n

Instalación de la biblioteca fmt

\n\n

Instalación a través de gestores de paquetes (Conan, vcpkg)

\n\n

La forma más sencilla de instalar fmt en un proyecto C++ moderno es usar un gestor de paquetes.

\n\n

Conan:

\n
conan install fmt/10.1.1@\n# o en tu conanfile.txt:\n# [requires]\n# fmt/10.1.1
\n\n

vcpkg:

\n
vcpkg install fmt\n# Luego en CMakeLists.txt:\n# find_package(fmt CONFIG REQUIRED)\n# target_link_libraries(your_project PRIVATE fmt::fmt)
\n\n

Instalación manual (compilación desde el código fuente)

\n\n

Puedes descargar el código fuente desde GitHub y compilarlo con CMake:

\n
git clone https://github.com/fmtlib/fmt.git\ncd fmt\nmkdir build && cd build\ncmake ..\nmake -j4\nsudo make install
\n\n

Instalación a través de pip (para usar en extensiones de Python)

\n\n

Aunque fmt es una biblioteca de C++, se puede instalar como un paquete de Python si estás escribiendo una extensión en C++ usando pybind11 o cppyy:

\n
pip install fmt
\n

Sin embargo, en el contexto de C++ puro, esto no tiene sentido. Normalmente, solo incluyes los archivos de cabecera.

\n\n

Vinculación al proyecto (modo header-only)

\n\n

fmt se puede usar en modo header-only, simplemente copiando la carpeta include/fmt en tu proyecto y añadiendo:

\n
#define FMT_HEADER_ONLY\n#include "fmt/core.h"\n#include "fmt/format.h"
\n\n

Inicio rápido con un ejemplo de código

\n\n

Comencemos con el ejemplo más simple que demuestra el formateo básico:

\n\n
#include <fmt/core.h>\n#include <fmt/format.h>\n#include <iostream>\n\nint main() {\n    // Formateo más simple\n    std::string message = fmt::format("¡Hola, {}! Tienes {} años.", "Mundo", 42);\n    std::cout << message << std::endl;\n\n    // Salida a stdout\n    fmt::print("El número Pi es aproximadamente {:.2f}\\n", 3.14159);\n\n    // Formateo con argumentos con nombre (estilo C++20)\n    fmt::print("Usuario: {name}, Edad: {age}\\n",\n               fmt::arg("name", "Alicia"),\n               fmt::arg("age", 30));\n\n    return 0;\n}
\n\n

Este código mostrará:

\n
¡Hola, Mundo! Tienes 42 años.\nEl número Pi es aproximadamente 3.14\nUsuario: Alicia, Edad: 30
\n\n

Como puedes ver, la sintaxis {} es muy similar a la de Python. Todo es intuitivo y legible.

\n\n

Métodos y funciones principales de la biblioteca fmt

\n\n

A continuación se presenta un desglose detallado de las funciones clave de fmt. Revisaremos sus firmas, parámetros y ejemplos

Recommendations