Metaprogramming | CRTP (Curiously Recurring Template Pattern) – 1

C++ 'da sınıflara ait fonksiyonalarda virtual mekanizması kullanılırsa bu sayede dynamic polymorhism ya da çalışma zamanı çok biçimliliği olarak isimlendirilen Late binding mekanizması devreye girer. Compiler bunu için bir virtual table (vtable) oluşturur ve çalışma zamanında bu tabloya bakarak hangi fonksiyonun çağrılacağına karar verir. Aşağıda buna ilişkin bir örneği görmek mümkündür.


Aşağıda programın devamı olan caller fonksiyonu derleme zamanında hangi call fonksiyonunun çağrılacağını belirlememektedir. Bunu çalışma zamanında vtable'a bakarak karar verecektir.


Fakat Late binding'in tahmin edeceğiniz gibi program çalışma sırasında performans kaybına neden olacaktır. Peki bu mekanizmayı template programming'in bize verdiği imkanlar çerçevesinde nasıl yapabiliriz. Şimdi aşağıdaki örnekle yukarıdaki örnekte sağladığımız esnekliği performans kaybına neden olmadan gerçekleştirelim:


Base sınıfın template haline getirilmesi ve sınıfın call fonksiyonunun içinde yapılan static_cast işlemi 1. büyük nokta, 2. büyük nokta ise her türetilen sınıfın base'in kendisi türünden açılımı yapılacak olan sınıftan  türetilmesidir. Bu iki adım CRTP idiyomunun gerçekleşmesini sağlayan en önemli noktalardır.


Yukarıdaki iki örneği derleyip çalıştırırsanız ikisi için de programın benzer çıktılar verdiği görülebilir. Burada iki metodun da kendine göre avantajları ve dezavantajları bulunmaktadır. İleriki yazılarımızda bunlara ilişkin daha detaylı bilgiler paylaşılacaktır.

Soru : Base sınıfının call fonksiyonunu aşağıdaki gibi güncellersek programın derleme/çalışma sonucu nasıl degişir?