C++ Academy · Lección

Plantillas variádicas y paquetes de parámetros

Use paquetes de parámetros y expresiones fold para escribir plantillas variádicas.

Lección 3 de 414 pasos

Plantillas variádicas y paquetes de parámetros es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Número variable de argumentos de plantilla

Las plantillas variádicas aceptan cualquier número de argumentos de plantilla. Se utilizan para escribir funciones como std::make_unique, std::tuple y sistemas de registro al estilo de printf.

Sintaxis de los paquetes de parámetros

Use typename... Ts para declarar un paquete de parámetros de tipo y Ts... para expandirlo.

template <typename... Args>
void print_all(Args... args) {
    // ...
}

Expansión de paquetes

Los ... que aparecen después de una expresión expanden el paquete en una lista separada por comas.

template <typename... Args>
void pass_through(Args... args) {
    other_func(args...);    // pass each arg
}

Plantillas variádicas recursivas (estilo antiguo)

Antes de C++17, las funciones variádicas normalmente se escribían de forma recursiva: se procesaba un argumento y después se repetía el proceso con el resto.

// base case
void log() {}

// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
    std::cout << first;
    log(rest...);
}

Expresiones fold (C++17)

C++17 añadió las expresiones fold, mucho más claras que la recursión. Permiten aplicar un operador a todo un paquete.

template <typename... Args>
auto sum(Args... args) {
    return (args + ...);    // fold +
}

std::cout << sum(1, 2, 3, 4);   // 10

Operadores fold

Hay cuatro formas de fold:

  • (... op pack): fold a la izquierda sobre una expansión unaria
  • (pack op ...): fold a la derecha
  • (init op ... op pack): fold a la izquierda con valor inicial
  • (pack op ... op init): fold a la derecha con valor inicial

Impresión de todos los argumentos

Es un patrón habitual con un fold de comas.

template <typename... Args>
void print_all(Args... args) {
    ((std::cout << args << " "), ...);   // comma fold
}

print_all(1, "hi", 3.14);   // 1 hi 3.14

Contar argumentos

sizeof...(pack) devuelve en tiempo de compilación el número de elementos de un paquete.

template <typename... Args>
void info(Args... args) {
    std::cout << "count = " << sizeof...(args);
}

Plantillas de clases variádicas

Las plantillas de clases también pueden tener paquetes de parámetros. Por ejemplo: std::tuple<Ts...>.

template <typename... Ts>
class Tuple {
    // implementation uses recursion or storage tricks
};

Perfect forwarding con paquetes

Combine plantillas variádicas con std::forward para reenviar perfectamente argumentos arbitrarios a un constructor.

template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

Manipulación de paquetes de tipos

Mediante la especialización de plantillas o las expresiones fold, puede implementar operaciones sobre listas en tiempo de compilación: obtener el primero o el último elemento, o descomponer la lista en cabeza y cola.

Errores habituales

Problemas comunes:

  • Olvidar expandir el paquete (args frente a args...)
  • Orden de evaluación en las expresiones fold (la dirección, izquierda o derecha, importa para las operaciones no asociativas)
  • Mayor tiempo de compilación debido a una recursión profunda

Comprobación rápida

¿Qué característica de C++17 simplifica la suma de todos los elementos de un paquete de parámetros?

Resumen

Las plantillas variádicas gestionan un número variable de argumentos de plantilla mediante paquetes de parámetros. Las expresiones fold de C++17 sustituyen el código variádico recursivo por expresiones concisas. Combinadas con el reenvío perfecto, permiten crear funciones factoría y mecanismos de despacho genéricos.

Gratis para empezar

Aprende C++ con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Plantillas variádicas y paquetes de parámetros» es gratis?

Sí — el texto completo de «Plantillas variádicas y paquetes de parámetros» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Plantillas variádicas y paquetes de parámetros»?

Use paquetes de parámetros y expresiones fold para escribir plantillas variádicas. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Plantillas variádicas y paquetes de parámetros»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Repaso de plantillas de funciones y clases
  2. Especialización parcial y completa de plantillas
  3. Plantillas variádicas y paquetes de parámetros
  4. Funciones constexpr e if constexpr
← Volver a C++ Academy