Programación funcional en C++: características modernas y 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

Programación funcional en C++: características modernas y ejemplos



La programación funcional (PF) es un paradigma en el que los cálculos se consideran como la evaluación de funciones matemáticas, evitando cambios de estado y datos mutables. Aunque C++ se asocia tradicionalmente con la programación orientada a objetos y procedural, a partir de C++11 y especialmente en C++14/17/20, el lenguaje ha adquirido potentes herramientas para el estilo funcional. En este artículo, analizaremos los conceptos clave que harán que tu código en C++ sea más conciso, seguro y expresivo.



1. Expresiones lambda y closures



Las expresiones lambda son funciones anónimas que se pueden utilizar en el lugar. Se han convertido en la base de la programación funcional en C++. La lambda captura variables del entorno (closure) y puede pasarse a los algoritmos de la STL.



Sintaxis de una expresión lambda

auto lambda = [captura](parámetros) -> tipo_de_retorno { cuerpo };


Ejemplo: ordenación con lambda

#include <iostream>#include <vector>#include <algorithm>

int main() { std::vector<int> nums = {5, 2, 8, 1, 9}; // Ordenación descendente std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; }); for (int n : nums) std::cout << n << " "; // 9 8 5 2 1 return 0;}


Closures: captura por valor y por referencia

#include <iostream>#include <vector>#include <algorithm>

int main() { int threshold = 5; std::vector<int> data = {1, 6, 3, 8, 2}; // Captura por valor [=] - copia de threshold auto count_greater = std::count_if(data.begin(), data.end(), [=](int x) { return x > threshold; }); // Captura por referencia [&] - se puede modificar auto modify = [&](int &x) { if (x < threshold) x += threshold; }; std::for_each(data.begin(), data.end(), modify); std::cout << "Count: " << count_greater << ""; // Count: 2 for (int n : data) std::cout << n << " "; // 6 6 8 8 7 return 0;}


2. Funtores y std::function



Los funtores son objetos de clases que sobrecargan el operador operator(). Pueden almacenar estado y comportarse como funciones. std::function es un envoltorio polimórfico para almacenar cualquier objeto invocable.



Ejemplo de funtor

#include <iostream>

class Adder {private: int base;public: Adder(int b) : base(b) {} int operator()(int x) const { return base + x; }};

int main() { Adder add5(5); std::cout << add5(10) << ""; // 15 std::cout << add5(20) << ""; // 25 return 0;}


std::function: envoltorio universal

#include <iostream>#include <functional>#include <vector>

void process(const std::vector<int>& data, std::function<bool(int)> predicate) { for (int x : data) { if (predicate(x)) std::cout << x << " "; } std::cout << "";}

int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6}; // Se pueden pasar lambdas process(numbers, [](int n) { return n % 2 == 0; }); // 2 4 6 process(numbers, [](int n) { return n > 3; }); // 4 5 6 // Y funtores struct GreaterThan { int limit; bool operator()(int n) const { return n > limit; } }; process(numbers, GreaterThan{4}); // 5 6 return 0;}


3. Algoritmos STL en estilo funcional



La biblioteca STL proporciona numerosos algoritmos que se combinan perfectamente con lambdas y funtores. En lugar de bucles, utiliza std::transf

Blogs

Book Recommendations