0Pricing
C++ Academy · Lección

Por qué usar concepts frente a SFINAE

Compare la legibilidad de concepts con las técnicas clásicas de SFINAE.

Por qué usar concepts frente a SFINAE es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 1 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.

La era de SFINAE

Antes de C++20, restringir las plantillas requería SFINAE (Substitution Failure Is Not An Error). Funcionaba, pero producía errores crípticos y código demasiado extenso.

Un ejemplo de SFINAE

Restringir una plantilla de función a tipos aritméticos antes de C++20.

template <typename T,
          typename = std::enable_if_t<std::is_arithmetic_v<T>>>
T double_it(T x) {
    return x * 2;
}

El problema de SFINAE

Problemas:

  • Signaturas de plantillas difíciles de leer
  • Errores crípticos del compilador cuando no se cumplen las restricciones
  • Es fácil equivocarse
  • Cada restricción añade código repetitivo

Conceptos: la solución clara

Los conceptos de C++20 expresan las restricciones directamente. El código es más claro y legible, y los mensajes de error son mucho mejores.

#include <concepts>

template <std::integral T>
T double_it(T x) {
    return x * 2;
}

Conceptos integrados

La biblioteca estándar proporciona muchos conceptos en <concepts>:

  • std::integral
  • std::floating_point
  • std::same_as
  • std::convertible_to
  • std::invocable

Mensajes de error mejorados

Cuando falla un concepto, el compilador informa de qué requisito no se cumplió. Con SFINAE, se obtenía una avalancha de errores de sustitución.

Los conceptos como documentación

El nombre de un concepto comunica su intención: una función restringida por std::integral indica a los lectores exactamente qué espera.

Sobrecarga de funciones mediante conceptos

Puede sobrecargar funciones usando conceptos diferentes. Gana la versión coincidente con más restricciones.

void f(std::integral auto x)        { /* integers */ }
void f(std::floating_point auto x)  { /* floats */ }

Subsunción de conceptos

El compilador entiende cuándo un concepto es más específico que otro. En algunos casos, std::integral subsume a std::regular; la resolución de sobrecargas prefiere el más específico.

Combinación con plantillas

Los conceptos funcionan tanto con plantillas de funciones como con plantillas de clases.

template <std::movable T>
class Buffer { /* ... */ };

Plantillas de funciones abreviadas

Con los conceptos, puede usar parámetros auto y restringirlos directamente en la declaración.

void greet(std::convertible_to<std::string> auto name) {
    std::cout << "Hello, " << name;
}

Migración desde SFINAE

Adopte los conceptos de forma progresiva. Sustituya una plantilla restringida mediante SFINAE cada vez. El compilador le ayudará con mensajes de error más claros.

Comprobación rápida

¿Cuál es la principal ventaja de los conceptos de C++20 frente a SFINAE?

Resumen

Los conceptos sustituyen SFINAE por una forma más clara y declarativa de restringir las plantillas. Los conceptos estándar de <concepts> cubren los casos habituales. Los errores señalan directamente el requisito que no se cumplió.

Preguntas frecuentes

¿La lección «Por qué usar concepts frente a SFINAE» es gratis?

Sí — el texto completo de «Por qué usar concepts frente a SFINAE» 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 «Por qué usar concepts frente a SFINAE»?

Compare la legibilidad de concepts con las técnicas clásicas de SFINAE. 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 1 de 4.

¿Cuánto tiempo toma la lección «Por qué usar concepts frente a SFINAE»?

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. Por qué usar concepts frente a SFINAE
  2. Definición de concepts con requires
  3. Uso de concepts en plantillas y auto
  4. Concepts estándar habituales: integral y ranges
← Volver a C++ Academy