Validación de datos en C++: bibliotecas y métodos (libvalidate, nlohmann/json, Boost)

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

Validación de datos en C++: resumen de bibliotecas y enfoques prácticos



La validación de datos es uno de los aspectos clave del desarrollo de software robusto en C++. La verificación correcta de los datos de entrada permite prevenir errores de ejecución, vulnerabilidades y comportamientos indefinidos. A diferencia de los lenguajes con tipado dinámico, C++ requiere que el desarrollador controle explícitamente los tipos y formatos. En este artículo, revisaremos tanto métodos manuales como bibliotecas especializadas que simplifican la validación.



1. Validación manual: técnicas básicas



La forma más simple es verificar los datos usando sentencias condicionales. Este enfoque es adecuado para proyectos pequeños, pero rápidamente se vuelve engorroso.



#include <iostream>#include <string>#include <cctype>

bool validateEmail(const std::string& email) { if (email.empty()) return false; size_t atPos = email.find('@'); if (atPos == std::string::npos || atPos == 0) return false; size_t dotPos = email.rfind('.'); if (dotPos == std::string::npos || dotPos <= atPos + 1) return false; if (dotPos == email.length() - 1) return false; return true;}

int main() { std::string testEmail = "user@example.com"; std::cout << (validateEmail(testEmail) ? "Valid" : "Invalid") << std::endl; return 0;}


Desventajas: complejidad de mantenimiento, duplicación de código, falta de una interfaz unificada.



2. Biblioteca libvalidate



libvalidate es una biblioteca ligera para validación declarativa de datos en C++17 y superiores. Permite describir reglas de verificación en un estilo encadenado, similar a los validadores en PHP o Python.



Instalación

La biblioteca se distribuye como header-only. Basta con copiar validate.hpp al proyecto o conectarla a través de CMake:

# Ejemplo FetchContentinclude(FetchContent)FetchContent_Declare(libvalidate    GIT_REPOSITORY https://github.com/username/libvalidate.git    GIT_TAG v1.0.0)FetchContent_MakeAvailable(libvalidate)


Ejemplo de uso

#include "validate.hpp"#include <iostream>#include <string>

int main() { using namespace validate;

// Validación de número (edad) int age = 25; auto ageResult = check(age) .min(18, "La edad debe ser al menos 18 años") .max(120, "La edad no debe superar los 120 años");

if (!ageResult.valid()) { std::cerr << ageResult.error() << std::endl; }

// Validación de cadena (contraseña) std::string password = "P@ssw0rd"; auto passResult = check(password) .minLength(8, "La contraseña debe tener al menos 8 caracteres") .matches(R"((?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*)", "La contraseña debe contener mayúsculas, minúsculas y dígitos");

if (!passResult.valid()) { std::cerr << passResult.error() << std::endl; }

// Validación combinada de objeto struct User { std::string name; int age; std::string email; };

User user{"Alice", 30, "alice@example.com"}; auto userResult = check(user) .field(&User::name, "name") .minLength(2) .maxLength(50) .field(&User::age, "age") .range(18, 100) .field(&User::email, "email") .email(); // verificación de email incorporada

if (!userResult.valid()) { for (const auto& err : userResult.errors()) { std::cerr << err.field << ": " << err.message << std::endl; } }

return 0;}


Características:

  • Soporte de reglas incorporadas: min, max, range, email, regex, notEmpty.
  • Posibilidad de crear

Recommendations