Kafayı template metaprogramming ile bozmuştum arkadaş. "Derleme zamanında hesaplama mı? constexpr mı? Bırakın beni, ben Template</B>'lerle gerçek sihri yapacağım" diyordum. Amacım basitti aslında, çalışma zamanında hiç iş yapmayacak, her şeyi derleme anında çözecek süper optimize bir matematik kütüphanesi yazacaktım. Fibonacci, faktoriyel, tip özellikleri... Her şey template recursion ile!
İlk başlar keyifliydi. Küçük bir faktoriyel hesaplattırmak bile bana kendimi Dijkstra sanmamı sağlıyordu. Ta ki, biraz daha "iddialı" bir şeyler yazana kadar. Derleyiciye biraz daha karmaşık bir tip listesi işleme (type list) ve derleme zamanında basit bir arama algoritması yazdırmaya kalktım.
make -j8 yazdığım an her şey durdu. Fanlar deli gibi dönmeye başladı. Terminaldeki ilerleme çubuğu, bir tortulaşma hızında ilerliyordu. 5 dakika... 10 dakika... "Bir template specialization daha eklesem ne olur ki?" dediğim an, derleme süresi 20 dakikaya fırladı. Kafayı yiyecektim! CMake bana adeta isyan ediyordu.
C++:
template<int N>
struct Factorial {
static const long long value = N Factorial<N-1>::value;
};
// Derleyici: "Yeter artık, seni insanlık düşmanı!"
StackOverflow'da, bloglarda deli gibi aradım. Meğerse sorun şuradaymış: Her template instantiation (somutlaştırma) derleyici için yeni bir şablon örneği oluşturuyor ve bu da derleme zamanı ve bellek kullanımı anlamına geliyormuş. Özyinelemeli (recursive) template'lerde bu, katlanarak büyüyen bir kabusa dönüşüyormuş. Ben derleme zamanında CPU'dan kazanayım derken, derleyicinin bellek ve CPU'sunu yer bitiriyormuşum. Şaka gibi!
Artık daha temkinliyim. Her şeyi template ile çözmeye çalışmanın bir anti-pattern olabileceğini anladım. C++11/14/17 ile gelen constexpr fonksiyonlar, çoğu durumda daha temiz, daha okunabilir ve derleyici dostu çözümler sunuyor. Template'leri, gerçekten ihtiyaç duyduğumda (CRTP, policy-based design, tip özellikleri gibi) ve ölçülü kullanıyorum.
Siz de benim gibi "Template'lerle dünyayı kurtaracağım" derken, derleme süreleriyle dünyanızı kararttığınız oldu mu? Bu işin makul ölçüde, pratik kullanımı için sizin taktikleriniz neler? Yoksa siz de constexpr'e mi geçtiniz?