<flat_map> #include <mdspan> int main() { // 4. std::print/println: formateo limpio std::println("=== C++23 ==="); std::print("Pi = {:.3f}\n", 3.14159); // 1. std::expected: errores sin excepciones enum class Error { Vacio, Invalido }; // 5. std::expected en uso for (auto s : {"42", "", "abc"}) { if (auto r = parsear(s); r) { std::println("{} -> {}", s, *r); } else { std::println("{} -> ERROR", s); } } std::expected<int, Error> parsear(std::string_view s) { if (s.empty()) return std::unexpected(Error::Vacio); try { return std::stoi(std::string(s)); } catch (...) { return std::unexpected(Error::Invalido); } } // 6. Deducing this Contador c; c.inc().inc().inc(); std::println("Valor: {}", c.val); // 2. Deducing this: CRTP simplificado template<typename D> struct Base { int val = 0; auto& inc(this auto& self) { ++self.val; return self; } }; // 7. std::flat_map: map eficiente std::flat_map<std::string, int> mapa; mapa["Ana"] = 28; mapa["Luis"] = 35; for (auto [k, v] : mapa) std::println("{}: {}", k, v); // 8. std::mdspan: vista multidimensional std::vector<int> datos = {1,2,3,4,5,6}; std::mdspan m(datos.data(), 2, 3); std::println("m[1,2] = {}", m[1,2]); struct Contador : Base<Contador> {}; // 3. if consteval constexpr int fact(int n) { if consteval { // rama compilacion return n <= 1 ? 1 : n * fact(n-1); } else { // rama ejecucion int r = 1; for (int i = 2; i <= n; ++i) r *= i; return r; } } Fundamentos de Programación con C++ // 9. Rangos: zip std::vector<int> a = {1,2,3}; std::vector<int> b = {4,5,6}; for (auto [x,y] : std::views::zip(a,b)) std::println("{},{}", x, y); return 0; } Abraham Zamudio Chauca 16 / 17