- Bjarne Stroustrup - Thriving in a crowded and changing world: C++ 2006–2020 - https://dl.acm.org/doi/10.1145/3386320
C++ News: La evolución de C++ en el período 2006-2020
Post actualizado: Simplificando el empleo de std::cin
- terminal::prompt: Imprime un mensaje en la terminal y aguarda a que el usuario introduzca el dato solicitado. Si el input es válido, éste es almacenado en una variable capturada por referencia. En caso contrario, vuelve a solicitarse el dato. Opcionalmente, es posible proporcionar una condición que deba ser satisfecha por el input.
- terminal::prompt_init: Una función auxiliar similar a la anterior que inicializa ella misma por defecto una variable del tipo a leer y procede a su lectura por la terminal.
- terminal::prompt_loop: Extiende la lista de argumentos de prompt() con una palabra clave centinela configurable por el programador, capaz de interrumpir bucles for y while.
Programando con C++20 (Parte III): Funciones std::erase y std::erase_if
- Concepts
- Lambdas 'templatizadas'
- Funciones std::erase y std::erase_if
- std::jthread
- CPOs (customization point objects)
Consideremos el problema de eliminar de un contenedor estándar todos aquellos elementos que cumplan un criterio específico, bien porque éstos se comparen igual a un cierto valor dado o porque cumplan un determinado predicado unario. De emplear estándares previos a C++20, la consecución de una acción de este tipo en contenedores como std::vector, std::string o std::deque requeriría el uso de la solución idiomática conocida bajo el nombre de erase-remove [1]. En contraste, listas como std::list o std::forward_list permitirían usar funciones miembro públicas de eliminación específicas.
Novedades del blog - Octubre de 2020
Asimismo, se han revisado numerosas entradas --particularmente las correspondientes al período 2015-2018-- con el fin de remaquetar sus códigos. La práctica totalidad de los artículos se encuentra ahora adaptada a las técnicas de programación propias de C++17 y/o C++20, empleando de forma consistente el estilo always auto.
La edición de los códigos se ha llevado a cabo en el entorno Visual Studio Code con el tema de color 'Dark (Visual Studio)', cuyo código fuente está disponible en el portal https://github.com/Microsoft/vscode bajo licencia MIT. Los ejemplos han sido puestos a prueba con el compilador GCC 9.3 o superior (https://gcc.gnu.org/).
Por supuesto, los posts seguirán siendo sometidos a revisiones periódicas con el objetivo de mejorar sus contenidos y corregir posibles erratas. El carácter divulgativo y sin ánimo de lucro del blog permanece, asimismo, como una de sus señas de identidad.
Programando con C++20 (Parte II): Lambdas 'templatizadas'
- Concepts
- Lambdas 'templatizadas'
- Funciones std::erase y std::erase_if
- std::jthread
- CPOs (customization point objects)
Introducción
Referencias de reenvío y auto&&
- Categorías de valor. Referencias lvalue y rvalue
- Inferencia automática de tipos (auto)
- Always auto: Una sintaxis moderna para C++
- Referencias de reenvío y auto&&
Reglas de deducción de tipos
Dada una plantilla de función, una referencia de reenvío es una referencia rvalue a uno de los parámetros de la plantilla. Dicha referencia debe carecer, además, de calificadores const-volatile. A modo de ejemplo, consideremos la plantilla de función f siguiente:
Range-v3: Una introducción a la biblioteca (Parte VI)
Artículos de la serie:
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort) y 2 (filter, to)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)
Range-v3: Una introducción a la biblioteca (Parte V)
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort, to) y 2 (filter)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)
Programando con C++20 (Parte I): Concepts
Integrando VSCode, Mingw-w64 y CMake (Parte V)
- Entorno MSYS2. Editor VSCode
- Construyendo un proyecto 'Hello, world!' con CMake
- Instalación de bibliotecas no-estándar
- Depuración en VSCode mediante GDB
- Ejemplo de árbol de directorios gestionado por CMake
Ejemplo de árbol de directorios gestionado por CMake
Como sabemos, CMake emplea ficheros de configuración CMakeLists.txt para producir archivos de construcción específicos que puedan ser utilizados por la herramienta de construcción nativa de nuestra plataforma (Make o Ninja, por ejemplo).
C++ News: ¿Dónde poder obtener información actualizada sobre el lenguaje?
C++ News: GCC 10.1
- Conceptos, incluyendo la sintaxis simplificada para plantillas de función con ligaduras.
- Structure bindings extendidos.
- Atributo [[nodiscard("with reason")]] con exposición de motivo.
- Inicialización de agregados con paréntesis, permitiendo su uso combinado con funciones como std::make_unique y std::make_shared.
- CTAD para agregados.
- Corrutinas (bajo -fcoroutines).
Programación basada en contratos (II)
Introducción
Diagrama basado en commons.wikimedia.org/wiki/File:Design_by_contract.svg (CC0 1.0) |
- Las precondiciones establecen los requisitos a verificar por los argumentos de una función (y/o el estado de otros objetos de la que dependa) en el punto de entrada de su ejecución. La responsabilidad de su cumplimiento recae en el cliente de la función (caller).
- Las postcondiciones fijan los requisitos a cumplir por los valores retornados por la función (y/o el estado de otros objetos) al finalizar su ejecución. Son una garantía ofrecida por la función (callee) al cliente.
- Las aserciones, por su parte, establecen condiciones que deban satisfacerse en puntos específicos del cuerpo de la función. Suelen emplearse para verificar el mantenimiento de los invariantes de una clase.
Programación basada en contratos (I)
Introducción
Centraremos nuestra atención, en particular, en las llamadas a funciones. Distinguiremos dos categorías principales de incidencias por las que una función puede no alcanzar sus objetivos: recuperables e irrecuperables. Un lenguaje más reciente, Rust, maneja dichas categorías de forma claramente diferenciada, proporcionando un tipo de retorno Result<T,E> para errores recuperables (el cual contiene un valor de tipo esperado T o bien un elemento de error E) y una macro panic! para detener la ejecución del proceso en caso de producirse una incidencia irrecuperable [1]. Por defecto, C++ trata la primera categoría mediante el uso de excepciones, cuya utilidad pondremos en valor en este post, aunque el empleo de tipos variantes sea sin duda factible gracias a bibliotecas como Boost.Outcome [2]. Como discutiremos también, el tratamiento de errores irrecuperables debería descansar en el uso de contratos.
Range-v3: Una introducción a la biblioteca (Parte IV)
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort, to) y 2 (filter)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)
Invocación inmediata de lambdas (técnica IIFE)
Introducción
Range-v3: Una introducción a la biblioteca (Parte III)
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort, to) y 2 (filter)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)
Range-v3: Una introducción a la biblioteca (Parte II)
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort, to) y 2 (filter)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)
Range-v3: Una introducción a la biblioteca (Parte I)
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort, to) y 2 (filter)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)