💻 Exemplos: Capítulo 03: Estruturas Condicionais, Init-Statements e Constexpr

Especialização em Sistemas com C++ • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar o controle de fluxo moderno em C++20: init-statements em instruções if e switch para limitação precisa do escopo de variáveis, if constexpr para ramificações resolvidas a custo zero em tempo de compilação (Zero-Cost Abstractions) e atributos de otimização de pipeline de branch prediction ([[likely]] e [[unlikely]]).


1. Código Fonte Completo (main.cpp)

/**
 * @file main.cpp
 * @brief Fluxo condicional com init-statements, if constexpr e previsores de desvio em C++20.
 */

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

// 1. Função Genérica Avaliada em Tempo de Compilação com if constexpr
template <typename T>
void inspecionar_e_despachar(T valor) {
    std::cout << "[Dispatcher] Valor recebido: " << valor << " -> ";
    if constexpr (std::is_integral_v<T>) {
        std::cout << "Tipo Inteiro primitivo (Tratamento via registradores ALUs)" << '\n';
    } else if constexpr (std::is_floating_point_v<T>) {
        std::cout << "Ponto Flutuante (Processamento via FPU/SSE/AVX)" << '\n';
    } else {
        std::cout << "Objeto/Tipo Complexo" << '\n';
    }
}

// Simulador de consulta a recurso de hardware com std::optional
enum class StatusOperacao { Sucesso = 0, Timeout = 1, FalhaCRC = 2 };

std::optional<std::string> ler_telemetria_dispositivo(int id_dispositivo) {
    if (id_dispositivo == 42) {
        return "Sensor_LiDAR_Status_OK";
    }
    return std::nullopt;
}

int main() {
    std::cout << "=== CAPÍTULO 03: CONDICIONAIS MODERNAS E CONSTEXPR ===" << '\n';

    // 2. Condicional 'if' com Init-Statement (C++17/C++20)
    // A variável 'sensor_data' existe APENAS dentro do escopo do bloco if/else
    if (auto sensor_data = ler_telemetria_dispositivo(42); sensor_data.has_value()) {
        std::cout << "Telemetria recebida com sucesso: " << *sensor_data << '\n';
    } else {
        std::cout << "Falha ao obter telemetria do dispositivo!" << '\n';
    }

    // 3. 'switch' com Init-Statement e Atributos [[likely]] / [[unlikely]] (C++20)
    switch (auto status = StatusOperacao::Sucesso; status) {
        case StatusOperacao::Sucesso: [[likely]]
            std::cout << "[Hardware] Operacao executada dentro do canal otimizado (LIKELY)." << '\n';
            break;
        case StatusOperacao::Timeout: [[unlikely]]
            std::cerr << "[Hardware] Alerta: Ocorreu estouro de tempo (TIMEOUT)!" << '\n';
            break;
        case StatusOperacao::FalhaCRC: [[unlikely]]
            std::cerr << "[Hardware] Erro critico de integridade (CRC ERROR)!" << '\n';
            break;
    }

    // 4. Testando if constexpr em tempo de compilação
    std::cout << "\n--- Avaliacao Compile-Time via if constexpr ---" << '\n';
    inspecionar_e_despachar(1048576);       // Inteiro
    inspecionar_e_despachar(3.1415926535);  // Double
    inspecionar_e_despachar("Texto Const"); // Ponteiro/String

    return 0;
}

2. Instruções de Compilação e Execução

# Compilação com GCC / Clang
g++ -std=c++20 -Wall -Wextra -O2 main.cpp -o app_condicionais
./app_condicionais

# Compilação com MSVC
cl /std:c++20 /EHsc /W4 /O2 main.cpp /Fe:app_condicionais.exe
.\app_condicionais.exe

3. Saída Esperada no Terminal

=== CAPÍTULO 03: CONDICIONAIS MODERNAS E CONSTEXPR ===
Telemetria recebida com sucesso: Sensor_LiDAR_Status_OK
[Hardware] Operacao executada dentro do canal otimizado (LIKELY).

--- Avaliacao Compile-Time via if constexpr ---
[Dispatcher] Valor recebido: 1048576 -> Tipo Inteiro primitivo (Tratamento via registradores ALUs)
[Dispatcher] Valor recebido: 3.14159 -> Ponto Flutuante (Processamento via FPU/SSE/AVX)
[Dispatcher] Valor recebido: Texto Const -> Objeto/Tipo Complexo