Templates

Código que sirve para cualquier tipo: funciones y clases genéricas, parámetros que son números, especialización, constexpr, concepts, templates variádicos y type traits.

13 aulas · 11 horas de práctica · en el navegador, sin instalar nada

Temario

  1. Por qué templates: un mayor para cualquier tipo — La misma función escrita tres veces (para int, para double, para string) es el mismo código tres veces, con tres lugares donde equivocarse. Un template la escribe una vez, con el tipo como hueco, y el compilador arma cada versión cuando la usás.
  2. Templates de función y deducción — El compilador adivina T mirando los argumentos. Casi siempre acierta, pero no convierte nada: con un int y un double no sabe qué elegir. Cómo decirle el tipo a mano, recibir con const T& para no copiar, la trampa de las comillas y dos parámetros de tipo.
  3. Templates de clase: Caja<T> — Lo mismo que con las funciones, ahora con structs y clases: una Caja<T> que guarda cualquier cosa, sus métodos, cómo se pasa a una función y el valor de fábrica T{}. Es exactamente lo que hacen vector<T> y todos los contenedores de la STL.
  4. Varios parámetros: Par<A, B> — Un template puede tener más de un hueco: Par<A, B> junta dos valores de tipos distintos, como una carta (número y palo). Funciones que deducen los dos tipos, pares dados vuelta, pares como resultado, y el std::pair que ya trae la biblioteca.
  5. Parámetros que no son tipos: Tablero<N> — Un template también puede recibir un número: Tablero<6> es un tablero de 6 x 6, y ese 6 se conoce al compilar, así que sirve para el tamaño de un arreglo. Bordes con N, funciones que deducen N, dos números (filas y columnas) y std::array<T, N>.
  6. Especialización — Un template sirve igual para todos los tipos... salvo cuando uno necesita otra cosa. La especialización es "para este tipo, este otro código": un patrón de ritmo que con un número cuenta pasos y con un texto lee las x. Funciones, clases, y la especialización parcial.
  7. constexpr: calcular al compilar — Los templates se resuelven al compilar. constexpr lleva esa idea a las cuentas: una función que el compilador puede ejecutar mientras compila, cuyo resultado llega al programa ya calculado. Cada luz del cohete es una de esas cuentas, y static_assert frena el despegue antes de que exista el programa.
  8. Concepts (C++20): errores que se entienden — Un template acepta cualquier tipo, y si el tipo no sirve, el error sale de adentro de la biblioteca en cincuenta líneas. Un concept escribe la condición en la puerta: "T tiene que saber volar". Se chequea al compilar, se lee como un bool, restringe templates y elige entre sobrecargas.
  9. Templates variádicos — Un acorde puede tener dos notas o cinco. Un template variádico recibe cualquier cantidad de argumentos: un paquete que se cuenta con sizeof..., se despliega con una fold expression o se recorre de a uno con recursión. Es lo que hay adentro de make_unique, tuple y emplace_back.
  10. Type traits e if constexpr — Adentro de un template, a veces el código depende del tipo: los helicópteros van primero, los globos no tienen "combustible", un double se redondea. Los type traits son preguntas sobre un tipo (is_same_v, is_pointer_v) y if constexpr elige la rama al compilar: la otra ni se compila.
  11. Tu propio contenedor genérico — Todo lo del módulo junto: una Cola<T> escrita por vos, con datos privados, métodos const y la misma interfaz para pedidos, turnos o lo que sea. Una función template que la recorre con una lambda, y un método más para los que se cuelan.
  12. Taller: pila genérica con tests — Una Pila<T> que sirve para números, textos y cartas, y un mini framework de tests genérico para probarla. Cada prueba es una cerradura de la sala de escape: la puerta se abre cuando pasan todas.
  13. Taller: mini biblioteca de matemática genérica — Un Vec2<T> que sirve con double para moverse suave y con int para las celdas del mapa, y las funciones que todo motor de juegos tiene: limitar, lerp, convertir y largo. Una nave que junta monedas, jugable con el teclado.

Es parte de