türden bağımsız lambdalar (generic lambda)

Geçen yazımızda lambda ifadelerini ele almıştık. Bu yazımızda ise C++14 standartlarıyla gelen araçlardan biri olan türden bağımsız lambda ifadelerini inceleyeceğiz.

C++14 standartlarıyla birlikte artık lambda ifadelerinde parametre değişkenleri auto belirteci ile bildirilebiliyor. Bu durumda derleyici, lambda işlevine yapılan çağrıda kullanılan argüman olan ifadenin türüne bakarak parametre değişkeninin türünün ne olması gerektiğini anlıyor. Yani derleyici auto ile belirtilen parametre değişkeni için bir tür çıkarımı (type deduction) gerçekleştiriyor. Aşağıdaki kodu inceleyelim:

main işlevi içinde oluşturulan lambda ifadesinde parametre değişkeni olan x‘in auto anahtar sözcüğü ile bildirildiğini görüyorsunuz. Daha sonra lambda işlevi farklı türden argümanlarla 3 kez çağrılıyor. Çağrı ifadelerinde farklı türden argüman ifadeler kullanıldığından derleyici 3 ayrı çağrı ifadesi için 3 ayrı işlevin kodunu yazıyor.
Peki derleyici nasıl bir kod oluşturuyor dersiniz? lambda ifadeleri için derleyicinin bir sınıf kodu yazdığını ve lambda işlevinin aslında derleyicinin yazdığı sınıfın (closure type) işlev çağrı operatör işlevi olduğunu hatırlayalım. Türden bağımısız lambda ifadeleri karşılığında derleyici bir işlev şablonu oluşturuyor:

Yukarıdaki kodda xyz_ isimli sınıfın derleyicinin oluşturduğu sözde kapanış (closure) sınıfı olduğunu düşünelim. Sınıfın operator() işlevinin bir işlev şablonu olduğunu görüyorsunuz. Böyle bir sınıfı derleyici yerine biz doğrudan yazsaydık, derleyici işleve gönderilen argüman olan ifadenin türünün ne olduğuna bakarak T şablon parametresi türünün ne olduğu çıkarımını yapacaktı, değil mi?

Türden bağımsız lambdalar özellikle STL algoritmaları ile birlikte kullanıldıklarında programcıya bir yazım kolaylığı sağlıyor. C++14 öncesinde programcının lambda işlevin parametresini yazmak zorunda olduğu aşağıdaki örneğe bakalım:

lambda işlevin parametresini doğrudan yazmak yerine şimdi lambda ifadesini şu şekilde oluşturabiliyoruz:
Üstelik bu yazdığımız lambda yalnızca
türü için değil size üye işlevi olan tüm sınıflar için kullanılabiliyor. Şimdi de aşağıdaki lambda ifadesine bakalım:
Böyle yazmak yerine
yazabiliriz, değil mi? Şablon tür parametrelerinin çıkarımında uygulanan kurallar aynı şekilde auto belirteci ile tanımlanan lambda işlev parametreleri için de geçerli. Örneğin bir lambda işlev parametresini aşağıdaki biçimlerde belirtebiliyoruz:

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun