Konu tarihi:
Şablonlar, C++'a evrensel algoritmalar ve veri yapıları uygulamak için etkili bir şekilde eklenmiştir. Başlangıçtan itibaren, şablonların kullanımını geliştiriciler için daha kullanışlı hale getirmek amacıyla giriş argümanlarına göre otomatik tür çıkarma mekanizması gereklidir.
Sorun:
Yerine koyma mekanizması her zaman açık değildir: referanslarla, türlerin maskelenmesiyle, kısmi uzmanlaşmalarla, referans türündeki şablon parametreleriyle ve sabitlerle belirsizlikler ortaya çıkar. Bazen derleyici türü çıkaramaz veya beklenmedik bir sonuç çıkarır.
Çözüm:
Derleyici argümanları analiz eder, bunları şablon parametreleriyle karşılaştırır ve cv-qualifier kurallarını, referansları ve işaretçileri dikkate alır. Eksiklikler ve kısıtlamalar otomatik yerleştirmenin mümkün olmadığı durumlarda türün açıkça belirtilmesini gerektirir.
Kod örneği:
template<typename T> void func(T arg) { /* ... */ } func(10); // T int olarak çıkarıldı func("abc"); // T const char* olarak çıkarıldı // T arg ile T& arg arasındaki fark: template<typename T> void printRef(T& arg); // Geçici nesneyi kabul etmez!
Anahtar özellikler:
Şablon fonksiyonu T& alırsa ve geçici bir nesne göndermeye çalışırsak ne olur?
Derleyici türü çıkaramaz çünkü geçici nesne, sabit olmayan bir referansa geçirilemez. Derleme hatası meydana gelir.
template<typename T> void foo(T& arg); foo(42); // Hata!
Dizilerle tür yerleştirmesi nasıl çalışır?
Diziler, değer olarak geçirildiğinde işaretçilere "dağıtılır", ancak şablon bir referansı kabul ederse dizi boyutu korunur, bu genellikle güvenli boyut şablonlarının uygulanması için kullanılır.
template<typename T, size_t N> void arraySize(T (&arr)[N]) { std::cout << N; } int x[10]; arraySize(x); // 10 yazdıracaktır
Şablon fonksiyon çağrılarının sonuçlarını tutarken auto kullanmanın her zaman doğru olmadığını neden?
Auto tür çıkarırken, bazen const veya ref-qualifier'ı "kesebilir", bu da beklenmedik kopyalama veya değiştirilebilirlik hatalarına yol açar.
auto x = funcReturningRef(); // x değer olarak olacak, referans değil!
Evrensel sıralama şablon fonksiyonu T& alır, kullanıcı geçici bir nesne göndermeye çalışır. Sonuç olarak kod derlenmez ve hata geliştirmede bir duraksama yaratır.
Artılar:
Eksiler:
Sıralayıcı, std::forward kullanarak evrensel referanslar (T&&) ile uygulanmıştır, bu da hem lvalue hem de rvalue ile düzgün bir şekilde çalışmayı sağlar ve böylece performans ve esnekliği artırır.
Artılar:
Eksiler: