C++ ha sido históricamente rico en herramientas de selección de flujo (if, switch, visitantes sobre std::variant, etc.), pero carece de una estructura nativa y unificada de pattern matching como la que vemos en Rust, Haskell o Swift. C++26 apunta (a través de la propuesta P2688R5) a llenar ese vacío.
En ciencias de la computación, pattern matching es una forma declarativa de comparar una estructura de datos con uno o más patrones y —si coincide— ejecutar código asociado, extraer valores de forma segura y reducir mucho el boilerplate de código de control.
Si alguna vez usaste pattern matching en lenguajes funcionales o en Rust:
match value {
Some(x) => println!("Tiene valor: {}", x),
None => println!("No tiene valor"),
}
C++ tiene herramientas poderosas (como std::variant + std::visit), pero:
- No existe un constructo nativo para comparar y destructurar tipos de forma concisa.
- El tradicional switch solo funciona con valores integrales y carece de destructuración o bindings.
Pattern matching permite cosas como:
- Comprobar la forma estructural de un valor.
- Extraer datos de una std::tuple, std::variant, o tipos compuestos.
- Reducir código repetitivo en código de control complejo.
Esto hace que tu código sea más claro, seguro y mantenible.
¿Pattern Matching estará en C++26? Todavía no es definitivo.
El estándar C++26 aún está en borrador y pattern matching aún está en discusión dentro del comité WG21. La propuesta principal —P2688R5— introduce un nuevo constructo match muy similar a lo que otros lenguajes usan.
Algunos desarrolladores creen que puede entrar en C++26 si todo marcha rápido.
Otros opinan que podría retrasarse hasta C++29 debido a temas de diseño/sintaxis.
Desde la propuesta P2688, se perfila un enfoque parecido a:
if (expr match [0, let foo]) {
// foo está ligado a algo útil aquí
}
expr match -> result_type {
pattern1 => /* acción 1 */,
pattern2 => /* acción 2 */,
_ => /* caso por defecto */
}
Aquí, match intenta casar expr con cada patrón.
let introduce variable(s) extraídas.
La sintaxis con => recuerda a Rust/Haskell, pero adaptada a C++ con sus propias reglas.
Esta sintaxis aún no es parte definitiva del estándar — puede cambiar hasta la ratificación final.
