C++11 değişken parametreli şablonları desteklemektedir. Dile gelen bu araçla birlikte hem sınıf şablonları (class templates) hem de fonksiyon şablonları (function templates) artık istenen sayıda parametreye sahip olabiliyor. Değişken sayıda parametreye "parametre paketi" (parameter pack) deniyor. Bir şablon parametre listesinde typename anahtar sözcüklerini izleyen üç nokta atomundan (ellipsis) sonra gelen isim, söz konusu şablon parametresinin sıfır ya da daha fazla sayıda türe karşılık geldiğine işaret etmektedir. Bu syntax'ta "typename… Types" şablon parametre paketi (template parameter pack), "Types… values" ise fonksiyon parametre paketi (function parameter pack) olarak isimlendirilmektedir. C++17'den önce variadic template yazılırken recursive bir yapıda yazma metodolojisi izleniyordu. Aşağıdaki örnekte görüleceği üzere ikinci printer() fonksiyonu recursive çağrı yapacak şekilde yazılmıştır.
Yukarıda tek parametreli bir template specialization yapıldığını görebilirsiniz. Toplamda iki tane fonksiyona ihtiyaç duyulmuştur. Peki C++17'den sonra durum nedir?
Yukarıda ilk dikkatimizi çeken nokta tek bir fonksiyonla işin halledilmiş olması. Peki bu nasıl gerçekleşti? Aşağıda fold (katlı ifadelerin açılımı) expression 'ların açılımı görülmektedir.
Burada belirleyici nokta operandların hangi sıraya göre yapılacağıdır.
- (… op pack) ----> ((pack1 op pack2 op …) op packN
- (init op … op pack) ----> (((init op pack1) op pack2) op …) op packN
- (pack op …) ----> pack1 op (… op (packN-1 op packN))
Aşağıda genelleştirilmiş şekilde ifade edildiği ve bir örnek üzerinde açıklandığını görebilirsiniz.
Aşağıda ise fold expression ifadelerin nasıl bir container içine yerleştirilebileceğine ilişkin örneği bulabilirsiniz.
Aşağıda ise C++17 öncesi variadic bir toplama fonksiyonunun yazılışı görülmektedir.
fold expression ile aynı fonksiyonun yazılışı aşağıdaki gibidir.
Soru1: aşağıdaki örnekte std::forward kullanılmasının bize ne gibi avanatajı veya dezavantajı vardır?
Soru2: Aşağıdaki kodun çıktısı ne olur?