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ü
Şema 5.1: Farklı Tipler İçin Üretilen Somut Kodlar (Specialized Code)
5.3 Modern Uygulama: Kavramlar ve Değişken Şablonlar
#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
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."