5.1 Turing Bütünlüğü ve Derleme Zamanı Mantığı

C++ Şablonları, kaza eseri Turing Bütünlüğüne (Turing Completeness) sahip olduğu keşfedilmiş bir alt dildir. Bu, derleyicinin kod derlenirken karmaşık algoritmaları çözebileceği anlamına gelir. Genelleyici Programlama (Generic Programming), veri tiplerinden bağımsız algoritmalar tasarlamamıza olanak tanır.

Şablon Örneklemesi (Instantiation)

Şablonlar kendi başlarına bir kod değildir; birer taslaktır. Derleyici, şablonu belirli bir tip ile kullandığınızda o tipe özel gerçek bir fonksiyon veya sınıf üretir. Buna Örnekleme (Instantiation) denir.

C++20 Kavramlar (Concepts)

Geleneksel SFINAE yönteminin akademik karmaşasını çözen, şablon parametrelerine kısıtlamalar (constraints) getiren modern mekanizmadır. Hata mesajlarını okunabilir kılar.

5.2 Şablon Örnekleme Yaşam Döngüsü

graph TD T[Template Definition] -->|Parametre: int| I[Instantiation: Template <int>] T -->|Parametre: double| D[Instantiation: Template <double>] I -->|Compile-time| CodeI[Gerçek Makine Kodu - int] D -->|Compile-time| CodeD[Gerçek Makine Kodu - double] subgraph "Kod Şişmesi (Code Bloat) Riski" CodeI CodeD end

Şema 5.1: Farklı Tipler İçin Üretilen Somut Kodlar (Specialized Code)

5.3 Modern Uygulama: Kavramlar ve Değişken Şablonlar

advanced_template_metaprogramming.cpp
#include <iostream>
#include <concepts> // C++20

/**
 * @brief Akademik Kavram (Concept) Tanımı
 * Sadece sayısal (Integral veya Floating Point) tipleri kabul eden bir kısıtlama.
 */
template 
concept Sayisal = std::integral<T> || std::floating_point<T>;

/**
 * @brief Değişken Sayıda Parametre Alan Şablon (Variadic Template)
 * @details Fold Expressions (C++17) kullanılarak tüm parametreler toplanır.
 */
template 
auto toplam_al(Args... args) {
    return (args + ...); // Unary Right Fold
}

int main() {
    // Derleyici burada int ve double için örnekleme (instantiation) yapar.
    auto sonuc = toplam_al(10, 20.5, 30, 4.2f);
    
    std::cout << "Toplam: " << sonuc << std::endl;

    // toplam_al("merhaba", 1); // HATA: 'Sayisal' kavramı (concept) sağlanmadı!
    
    return 0;
}

Mimarın Analizi:

Kodda görülen `(args + ...)` ifadesi bir Katlama İfadesidir (Fold Expression). C++17 öncesinde bu işlem için özyinelemeli (recursive) şablon çağrıları gerekiyordu. C++20 Kavramlar (Concepts) ise, hatalı tip kullanımını "derleme zamanında" ve çok net hata mesajlarıyla yakalamamızı sağlar.

Özelleştirme (Specialization):

Belirli bir tip için (örneğin `bool`) şablonun farklı davranmasını istiyorsak Tam Özelleştirme (Full Specialization) kullanırız. Bu, C++'da "Ad-hoc Polymorphism" olarak bilinir.

⚠️ Şablon Hataları ve Yan Etkileri

Kod Şişmesi (Code Bloat): Şablonun çok fazla farklı tiple kullanılması sonucu yürütülebilir dosya boyutunun (binary size) aşırı büyümesi.
Sinsi Hatalar (Two-phase Lookup): Şablonun tanımında değil, sadece kullanıldığı (instantiation) noktada ortaya çıkan karmaşık derleme hataları.

5.5 Akademik Değerlendirme

Soru: C++20 'Concepts' (Kavramlar) mekanizmasının SFINAE yöntemine göre en büyük avantajı nedir?

Pratik Görev (Telegram Challenge):

"trcpp-telegram topluluğunda 'Compile-time Fibonacci' sorusu sıkça tartışılır. C++20 'consteval' veya Şablon Metaprogramlama kullanarak, 10. Fibonacci sayısını derleme zamanında hesaplayan bir yapı oluşturun."