Framework CLI para C++: cppcli — creación de potentes aplicaciones de consola
El desarrollo de interfaces de línea de comandos (CLI) en C++ a menudo requiere análisis manual de argumentos, manejo de banderas y organización de comandos. La biblioteca cppcli proporciona un framework listo para crear rápidamente aplicaciones CLI profesionales. Permite centrarse en la lógica de negocio, no en la infraestructura de entrada/salida. En este artículo, analizaremos las características clave de cppcli, proporcionaremos ejemplos de código y mostraremos cómo integrarlo en su proyecto.
Características principales de cppcli
- Definición declarativa de comandos — cada comando se describe como una clase separada o una función lambda.
- Análisis automático de argumentos — soporte para argumentos posicionales, con nombre y banderas.
- Salida a color y formato — utilidades integradas para salida estilizada (colores ANSI, tablas, barras de progreso).
- Validación y ayuda — generación automática de mensajes de ayuda y verificación de argumentos obligatorios.
- Extensibilidad — soporte para tipos de argumentos personalizados y middleware.
Inicio rápido: instalación y primer ejemplo
cppcli se distribuye como una biblioteca header-only. Para instalarla, clone el repositorio o use CMake FetchContent. Inclusión en el proyecto:
#include <cppcli/cli.h>#include <iostream>
int main(int argc, char* argv[]) { cppcli::App app("Mi aplicación", "1.0.0"); app.run(argc, argv); return 0;}Este es un esqueleto mínimo. Ahora agreguemos un comando greet que recibe el nombre del usuario.
Ejemplo: comando con argumentos
#include <cppcli/cli.h>
int main(int argc, char* argv[]) { cppcli::App app("Greeter", "1.0.0");
app.command("greet", "Saluda al usuario") .argument<std::string>("name", "Nombre del usuario") .action([](const cppcli::Args& args) { std::string name = args.get<std::string>("name"); std::cout << "¡Hola, " << name << "!"; });
app.run(argc, argv); return 0;}Ejecución: ./app greet Juan mostrará ¡Hola, Juan!. Si no se especifica el argumento, cppcli mostrará un error y la ayuda.
Banderas y parámetros opcionales
Agreguemos la bandera --formal para un saludo formal:
app.command("greet", "Saluda al usuario") .argument<std::string>("name", "Nombre") .flag("--formal", "-f", "Saludo formal") .action([](const cppcli::Args& args) { std::string name = args.get<std::string>("name"); bool formal = args.get<bool>("formal"); if (formal) std::cout << "Buenos días, " << name << "!"; else std::cout << "¡Hola, " << name << "!"; });Ahora ./app greet Juan --formal mostrará Buenos días, Juan!.
Comandos anidados y subcomandos
cppcli admite una estructura de comandos en árbol. Por ejemplo, para una utilidad de gestión de proyectos:
app.command("project", "Gestión de proyectos") .command("create", "Crear proyecto") .argument<std::string>("name", "Nombre del proyecto") .action([](const cppcli::Args& args) { std::cout << "Proyecto creado: " << args.get<std::string>("name") << ""; }) .command("delete", "Eliminar proyecto") .argument<std::string>("name", "Nombre del proyecto") .flag("--force", "Sin confirmación") .action([](const cppcli::Args& args) { // lógica de eliminación });Ejecución: ./app project
También en la biblioteca
Planificador de tareas en Go (Golang): cron, gocron y asynq
WireMock.Net para C# (.NET): guía completa con ejemplos
Monitoreo de aplicaciones Java: herramientas y bibliotecas para la recopilación de métricas
Aprendizaje automático en JavaScript: bibliotecas para Node.js — revisión y ejemplos