-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
/*
================================================================================
🚀 MODERN ISO C++ PROGRAMLAMA DERSLERİ: BÖLÜM 10 (FİNAL) 🚀
ISO C++20 / C++23 Geleceği: std::span, std::expected & Monadic Error Handling
================================================================================
GİRİŞ 📌
--------------------------------------------------------------------------------
Dokuzuncu bölümde ISO C++20 Coroutines mimarisini, `co_yield` kullanımını, Promise
Object, Coroutine Handle ve Coroutine Frame etkileşimini ve tembel değerlendirilen
(lazily evaluated) bir Generator yapısını incelemiştik.
Bu FİNAL bölümünde ise modern C++ ekosisteminin en güncel standartları olan ISO C++20
ve C++23 ile gelen **Zero-Copy veri erişim araçlarını (`std::span`, `std::string_view`)**,
istisnalara (exceptions) performanslı alternatif sunan **Monadik Hata Yönetimini
(`std::expected`)** ve ileri seviye C++ mimari prensiplerini ele alacağız.
*/
#include <iostream>
#include <span>
#include <string_view>
#include <expected>
#include <vector>
#include <array>
#include <string>
// =============================================================================
// 1. ZERO-COPY VERİ ERİŞİMİ: `std::string_view` VE ISO C++20 `std::span` ⚡
// =============================================================================
/*
* Geleneksel C++'ta veri koleksiyonlarını parametre olarak geçerken kopyalama
* maliyetinden kaçınmak için `const std::vector<T>&` veya `const std::string&`
* kullanılırdı. Ancak bu durum C dizileri, `std::array` veya bellek blokları için
* esneklik sağlamıyordu.
*
* `std::string_view` (C++17) & `std::span<T>` (C++20):
* - Verinin SAHİBİ DEĞİLDİR (Non-owning view).
* - Sadece iki eleman tutar (sizeof = 2 * sizeof(void*)):
* 1. T* data_ptr (Bellek başlangıç adresi)
* 2. size_t count (Eleman sayısı)
* - Sıfır kopyalama (Zero-copy), sıfır tahsis (Zero-allocation) ile dizi, vector
* veya C-array üzerinde performanslı dilimleme (slicing) sağlar.
*/
void print_buffer(std::span<const int> data) {
std::cout << "📦 Buffer [Boyut: " << data.size() << "]: ";
for (int val : data) {
std::cout << val << " ";
}
std::cout << "\n";
}
void demonstrate_zero_copy_views() {
std::vector<int> vec{10, 20, 30, 40, 50};
int raw_arr[] = {1, 2, 3, 4, 5};
std::array<int, 3> std_arr{100, 200, 300};
// Aynı fonksiyon hiç kopyalama yapmadan 3 farklı veri yapısını da kabul eder!
print_buffer(vec);
print_buffer(raw_arr);
print_buffer(std_arr);
// span Dilimleme (Slicing):
std::span<const int> sub_span = std::span(vec).subspan(1, 3); // {20, 30, 40}
print_buffer(sub_span);
}
// =============================================================================
// 2. MONADİK HATA YÖNETİMİ: ISO C++23 `std::expected<T, E>` 🎯
// =============================================================================
/*
* C++'ta geleneksel hata yönetimi yöntemleri ve sorunları:
* 1. Hata Kodları (C-style): Dönüş değerini kirletir, gözden kaçırılabilir.
* 2. Exceptions (`throw/catch`): Çalışma zamanı maliyeti yüksektir (Unwind Table),
* Gömülü/Real-Time (DO-254, MISRA C++) sistemlerde yasaktır!
*
* ÇÖZÜM: `std::expected<T, E>` (ISO C++23)
* - Bir fonksiyonun YA başarılı değer `T` YA DA hata detayını `E` döndürmesini garanti eder.
* - Sıfır Exception maliyeti ile derleme zamanı güvenliği sağlar.
* - Monadik zincirleme metodları (`and_then`, `transform`, `or_else`) destekler!
*/
enum class ParseError {
EmptyString,
InvalidCharacter,
Overflow
};
std::expected<int, ParseError> parse_integer(std::string_view sv) {
if (sv.empty()) {
return std::unexpected(ParseError::EmptyString);
}
int result = 0;
for (char ch : sv) {
if (ch < '0' || ch > '9') {
return std::unexpected(ParseError::InvalidCharacter);
}
result = result * 10 + (ch - '0');
}
return result; // Başarılı dönüş (value)
}
void demonstrate_monadic_error_handling() {
auto res1 = parse_integer("2026");
auto res2 = parse_integer("12A45");
std::cout << "⚡ ISO C++23 std::expected Hata Yönetimi:\n";
if (res1.has_value()) {
std::cout << " ✔ Başarılı Parse: " << *res1 << "\n";
}
if (!res2) { // implicit bool conversion
std::cout << " ❌ Parse Hatası Yakalandı! Hata Kodu: ";
switch (res2.error()) {
case ParseError::EmptyString: std::cout << "Boş Metin\n"; break;
case ParseError::InvalidCharacter: std::cout << "Geçersiz Karakter\n"; break;
case ParseError::Overflow: std::cout << "Taşma Oluştu\n"; break;
}
}
}
// =============================================================================
// 3. MAIN VE PROGRAM GİRİŞ NOKTASI 🚀
// =============================================================================
int main() {
std::cout << "============================================" << std::endl;
std::cout << " ISO C++17/20/23 Dersleri - Bolum 10 (FİNAL)" << std::endl;
std::cout << "============================================" << std::endl << std::endl;
std::cout << "--- 1. std::span ve Zero-Copy Views ---" << std::endl;
demonstrate_zero_copy_views();
std::cout << "\n--- 2. ISO C++23 std::expected & Monadic Error Handling ---" << std::endl;
demonstrate_monadic_error_handling();
std::cout << "\n✔ Bolum 10 ve Tüm Modern C++ Kursu Başarıyla Tamamlandı!" << std::endl;
return 0;
}
/*
================================================================================
🎓 MODERN ISO C++ KURS TAMAMLANDI 🎓
================================================================================
KURS ÖZETİ VE EDİNİLEN KAZANIMLAR:
--------------------------------------------------------------------------------
1. Bölüm 1: Modern C++ Mimarisi, ISO Standartları & Derleyici Derinlikleri
2. Bölüm 2: Bellek Yönetimi: Stack vs Heap, Pointer/Reference, Undefined Behavior
3. Bölüm 3: RAII İlkesi, Rule of 0/3/5 & Move Semantics (rvalue references)
4. Bölüm 4: Smart Pointers Mimarisi (unique_ptr, shared_ptr, weak_ptr)
5. Bölüm 5: STL Kapsayıcıları: vector büyüme stratejisi, map vs unordered_map
6. Bölüm 6: Template Metaprogramming, SFINAE & ISO C++20 Concepts / Constraints
7. Bölüm 7: Lambda İfadeleri, Closure Mimarisi & std::function Maliyet Analizi
8. Bölüm 8: Eşzamanlılık (Concurrency), std::jthread, std::scoped_lock & std::async
9. Bölüm 9: ISO C++20 Coroutines (co_yield, Promise Object, Generators)
10. Bölüm 10: ISO C++20/23 Geleceği: std::span, std::expected & Monadic Error Handling
İLERİ SEVİYE C++ KAYNAK TAVSİYELERİ 📚:
- Effective Modern C++ (Scott Meyers)
- C++ Core Guidelines (Bjarne Stroustrup & Herb Sutter)
- C++ Concurrency in Action (Anthony Williams)
================================================================================
Gazi Mustafa Kemal Atatürk, Fati
h Sultan Mehmed ve Modern ISO C++ Serilerinin Sonu.
================================================================================
*/
================================================================================
🚀 MODERN ISO C++ PROGRAMLAMA DERSLERİ: BÖLÜM 10 (FİNAL) 🚀
ISO C++20 / C++23 Geleceği: std::span, std::expected & Monadic Error Handling
================================================================================
GİRİŞ 📌
--------------------------------------------------------------------------------
Dokuzuncu bölümde ISO C++20 Coroutines mimarisini, `co_yield` kullanımını, Promise
Object, Coroutine Handle ve Coroutine Frame etkileşimini ve tembel değerlendirilen
(lazily evaluated) bir Generator yapısını incelemiştik.
Bu FİNAL bölümünde ise modern C++ ekosisteminin en güncel standartları olan ISO C++20
ve C++23 ile gelen **Zero-Copy veri erişim araçlarını (`std::span`, `std::string_view`)**,
istisnalara (exceptions) performanslı alternatif sunan **Monadik Hata Yönetimini
(`std::expected`)** ve ileri seviye C++ mimari prensiplerini ele alacağız.
*/
#include <iostream>
#include <span>
#include <string_view>
#include <expected>
#include <vector>
#include <array>
#include <string>
// =============================================================================
// 1. ZERO-COPY VERİ ERİŞİMİ: `std::string_view` VE ISO C++20 `std::span` ⚡
// =============================================================================
/*
* Geleneksel C++'ta veri koleksiyonlarını parametre olarak geçerken kopyalama
* maliyetinden kaçınmak için `const std::vector<T>&` veya `const std::string&`
* kullanılırdı. Ancak bu durum C dizileri, `std::array` veya bellek blokları için
* esneklik sağlamıyordu.
*
* `std::string_view` (C++17) & `std::span<T>` (C++20):
* - Verinin SAHİBİ DEĞİLDİR (Non-owning view).
* - Sadece iki eleman tutar (sizeof = 2 * sizeof(void*)):
* 1. T* data_ptr (Bellek başlangıç adresi)
* 2. size_t count (Eleman sayısı)
* - Sıfır kopyalama (Zero-copy), sıfır tahsis (Zero-allocation) ile dizi, vector
* veya C-array üzerinde performanslı dilimleme (slicing) sağlar.
*/
void print_buffer(std::span<const int> data) {
std::cout << "📦 Buffer [Boyut: " << data.size() << "]: ";
for (int val : data) {
std::cout << val << " ";
}
std::cout << "\n";
}
void demonstrate_zero_copy_views() {
std::vector<int> vec{10, 20, 30, 40, 50};
int raw_arr[] = {1, 2, 3, 4, 5};
std::array<int, 3> std_arr{100, 200, 300};
// Aynı fonksiyon hiç kopyalama yapmadan 3 farklı veri yapısını da kabul eder!
print_buffer(vec);
print_buffer(raw_arr);
print_buffer(std_arr);
// span Dilimleme (Slicing):
std::span<const int> sub_span = std::span(vec).subspan(1, 3); // {20, 30, 40}
print_buffer(sub_span);
}
// =============================================================================
// 2. MONADİK HATA YÖNETİMİ: ISO C++23 `std::expected<T, E>` 🎯
// =============================================================================
/*
* C++'ta geleneksel hata yönetimi yöntemleri ve sorunları:
* 1. Hata Kodları (C-style): Dönüş değerini kirletir, gözden kaçırılabilir.
* 2. Exceptions (`throw/catch`): Çalışma zamanı maliyeti yüksektir (Unwind Table),
* Gömülü/Real-Time (DO-254, MISRA C++) sistemlerde yasaktır!
*
* ÇÖZÜM: `std::expected<T, E>` (ISO C++23)
* - Bir fonksiyonun YA başarılı değer `T` YA DA hata detayını `E` döndürmesini garanti eder.
* - Sıfır Exception maliyeti ile derleme zamanı güvenliği sağlar.
* - Monadik zincirleme metodları (`and_then`, `transform`, `or_else`) destekler!
*/
enum class ParseError {
EmptyString,
InvalidCharacter,
Overflow
};
std::expected<int, ParseError> parse_integer(std::string_view sv) {
if (sv.empty()) {
return std::unexpected(ParseError::EmptyString);
}
int result = 0;
for (char ch : sv) {
if (ch < '0' || ch > '9') {
return std::unexpected(ParseError::InvalidCharacter);
}
result = result * 10 + (ch - '0');
}
return result; // Başarılı dönüş (value)
}
void demonstrate_monadic_error_handling() {
auto res1 = parse_integer("2026");
auto res2 = parse_integer("12A45");
std::cout << "⚡ ISO C++23 std::expected Hata Yönetimi:\n";
if (res1.has_value()) {
std::cout << " ✔ Başarılı Parse: " << *res1 << "\n";
}
if (!res2) { // implicit bool conversion
std::cout << " ❌ Parse Hatası Yakalandı! Hata Kodu: ";
switch (res2.error()) {
case ParseError::EmptyString: std::cout << "Boş Metin\n"; break;
case ParseError::InvalidCharacter: std::cout << "Geçersiz Karakter\n"; break;
case ParseError::Overflow: std::cout << "Taşma Oluştu\n"; break;
}
}
}
// =============================================================================
// 3. MAIN VE PROGRAM GİRİŞ NOKTASI 🚀
// =============================================================================
int main() {
std::cout << "============================================" << std::endl;
std::cout << " ISO C++17/20/23 Dersleri - Bolum 10 (FİNAL)" << std::endl;
std::cout << "============================================" << std::endl << std::endl;
std::cout << "--- 1. std::span ve Zero-Copy Views ---" << std::endl;
demonstrate_zero_copy_views();
std::cout << "\n--- 2. ISO C++23 std::expected & Monadic Error Handling ---" << std::endl;
demonstrate_monadic_error_handling();
std::cout << "\n✔ Bolum 10 ve Tüm Modern C++ Kursu Başarıyla Tamamlandı!" << std::endl;
return 0;
}
/*
================================================================================
🎓 MODERN ISO C++ KURS TAMAMLANDI 🎓
================================================================================
KURS ÖZETİ VE EDİNİLEN KAZANIMLAR:
--------------------------------------------------------------------------------
1. Bölüm 1: Modern C++ Mimarisi, ISO Standartları & Derleyici Derinlikleri
2. Bölüm 2: Bellek Yönetimi: Stack vs Heap, Pointer/Reference, Undefined Behavior
3. Bölüm 3: RAII İlkesi, Rule of 0/3/5 & Move Semantics (rvalue references)
4. Bölüm 4: Smart Pointers Mimarisi (unique_ptr, shared_ptr, weak_ptr)
5. Bölüm 5: STL Kapsayıcıları: vector büyüme stratejisi, map vs unordered_map
6. Bölüm 6: Template Metaprogramming, SFINAE & ISO C++20 Concepts / Constraints
7. Bölüm 7: Lambda İfadeleri, Closure Mimarisi & std::function Maliyet Analizi
8. Bölüm 8: Eşzamanlılık (Concurrency), std::jthread, std::scoped_lock & std::async
9. Bölüm 9: ISO C++20 Coroutines (co_yield, Promise Object, Generators)
10. Bölüm 10: ISO C++20/23 Geleceği: std::span, std::expected & Monadic Error Handling
İLERİ SEVİYE C++ KAYNAK TAVSİYELERİ 📚:
- Effective Modern C++ (Scott Meyers)
- C++ Core Guidelines (Bjarne Stroustrup & Herb Sutter)
- C++ Concurrency in Action (Anthony Williams)
================================================================================
Gazi Mustafa Kemal Atatürk, Fati
h Sultan Mehmed ve Modern ISO C++ Serilerinin Sonu.
================================================================================
*/
🔒 Bu içeriği görmek için giriş yapın