0Pricing
C++ Academy · Lección

Lógica condicional

std::conditional e if constexpr

Lógica condicional 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.

Elegir tipos y ramas

La lógica basada en traits de tipos permite que el código elija tipos y rutas de código en tiempo de compilación. Las herramientas principales son std::conditional e if constexpr.

std::conditional

std::conditional_t<cond, A, B> se evalúa como A cuando cond es true y como B en caso contrario.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::conditional_t<true, int, double>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

Seleccionar un tipo de almacenamiento

Un uso habitual es elegir un tipo más amplio para los valores grandes y uno más estrecho en los demás casos.

#include <iostream>
#include <type_traits>

template <bool Big>
struct Storage {
    using type = std::conditional_t<Big, long long, short>;
};

int main() {
    Storage<true>::type a = 10;
    std::cout << sizeof(a) << "\n";
    return 0;
}

Conceptos básicos de if constexpr

if constexpr (C++17) descarta en tiempo de compilación la rama que no se elige. Solo la rama elegida debe compilar para el tipo dado.

#include <iostream>
#include <type_traits>

template <typename T>
void describe(T v) {
    if constexpr (std::is_integral_v<T>)
        std::cout << "integer: " << v << "\n";
    else
        std::cout << "other: " << v << "\n";
}

int main() {
    describe(5);
    describe(2.5);
    return 0;
}

Por qué if constexpr supera a if en tiempo de ejecución

Con un if normal, ambas ramas deben compilar para cualquier T. Con if constexpr, la rama descartada no se instancia, por lo que puede contener código específico del tipo que, de otro modo, no sería válido.

Operaciones específicas del tipo

Esto es imposible con un if simple porque .length() no compilaría para int.

#include <iostream>
#include <string>
#include <type_traits>

template <typename T>
auto size_of(const T& v) {
    if constexpr (std::is_same_v<T, std::string>)
        return v.length();
    else
        return sizeof(v);
}

int main() {
    std::cout << size_of(std::string("hi")) << "\n";
    std::cout << size_of(42) << "\n";
    return 0;
}

enable_if para sobrecargas

Antes de if constexpr, std::enable_if seleccionaba sobrecargas mediante SFINAE. Elimina una función de la resolución de sobrecargas cuando una condición es falsa.

#include <iostream>
#include <type_traits>

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }

int main() {
    only_int(7);
    return 0;
}

Combinar condiciones

Puede combinar traits con &&, || y ! en condiciones evaluadas en tiempo de compilación, igual que los booleanos normales.

#include <iostream>
#include <type_traits>

template <typename T>
void check() {
    if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
        std::cout << "non-bool integer\n";
    else
        std::cout << "something else\n";
}

int main() {
    check<int>();
    check<bool>();
    return 0;
}

Selección recursiva en tiempo de compilación

if constexpr permite la recursión en tiempo de compilación, lo que resulta útil para procesar tuplas o paquetes de parámetros elemento por elemento.

conjunction y disjunction

C++17 también proporciona std::conjunction y std::disjunction para realizar operaciones lógicas AND/OR con evaluación de cortocircuito sobre una lista de traits.

Elegir la herramienta adecuada

Utilice conditional para seleccionar un tipo, if constexpr para seleccionar código y enable_if/concepts para controlar la resolución de sobrecargas. El código moderno favorece if constexpr y los conceptos por su claridad.

Comprobación rápida

Recuerde el beneficio clave de if constexpr.

Resumen

Ha aprendido la lógica condicional en tiempo de compilación.

  • conditional_t<c,A,B> selecciona un tipo
  • if constexpr selecciona código y descarta la otra rama
  • enable_if controla la resolución de sobrecargas mediante SFINAE
  • Combine traits con operadores lógicos

Preguntas frecuentes

¿La lección «Lógica condicional» es gratis?

Sí — el texto completo de «Lógica condicional» 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 «Lógica condicional»?

std::conditional e if constexpr 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 «Lógica condicional»?

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. Consulta de tipos
  2. Transformación de tipos
  3. Lógica condicional
  4. Escritura de traits personalizados
← Volver a C++ Academy