💻 Exemplos: Capítulo 03: Estruturas Condicionais, Init-Statements e Constexpr
💻 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