CodeBlanks Logo Icon CodeBlanks

Metaprogramming

Template metaprogramming ile derleme zamanı kod üretirsin.

Template metaprogramming ile faktöriyel

Template metaprogramming ile derleme zamanında faktöriyel hesaplayabiliriz. Genel durum kendine başvurur: Factorial<N>::value = N * Factorial<N-1>::value. Temel durum bir uzmanlaşma ile verilir: template <> struct Factorial<0> { static const int value = 1; };.

Derleyici Factorial<5> için 5 * 4 * 3 * 2 * 1 * 1 zincirini derleme zamanında açar ve 120 sonucunu çalıştırılabilir dosyaya sabit olarak gömer. Çalışma zamanında hesap yapılmaz. Önceki dersin Engine iskeletinin yanına bu şablonu ekleyeceğiz.

Factorial<5>::value erişimi

Sonuca erişmek için şablon adını, açılı parantez içinde değeri ve ::value yazarsın: Factorial<5>::value. Derleyici bunu 120 sabitine dönüştürür. std::cout ile yazdırabilirsin: std::cout << Factorial<5>::value; ekrana 120 basar.

Çıktıyı yeni satırda görmek için std::endl ekleriz. Böylece önceki dersin Hazır çıktısının altında 120 görünür. Her ders çıktıyı korur ve yenisini ekler. Bu birikimli yapı, projenin aşama aşama büyüdüğünü gösterir.

Uygulama Factorial şablonunu ekle ve çağır

Önceki dersin Engine iskeletini al. Engine sınıfından önce template <int N> struct Factorial tanımla: gövdesi static const int value = N * Factorial<N-1>::value;. Temel durum uzmanlaşması template <> struct Factorial<0> { static const int value = 1; };. main içinde std::cout << "Hazır" << std::endl; satırından sonra std::cout << Factorial<5>::value; ekle.

Başlangıç kodu

main.cpp
#include <iostream>

class Engine {
public:
    static const int Version = 1;
};

// Factorial şablonunu buraya tanımla

int main() {
    std::cout << "Hazır" << std::endl;
    // Sonucu yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Engine {
public:
    static const int Version = 1;
};

template <int N>
struct Factorial {
    static const int value = N * Factorial<N - 1>::value;
};

template <>
struct Factorial<0> {
    static const int value = 1;
};

int main() {
    std::cout << "Hazır" << std::endl;
    std::cout << Factorial<5>::value;
    return 0;
}

Beklenen çıktı

Hazır
120

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Temel durumu tamamla

Soru
template <> struct Factorial<0> { static const int value = ____; };
Cevap
template <> struct Factorial<0> { static const int value = 1; };

Açıklama: value = 1 yazılır; 0 faktöriyel 1'dir.

2 Factorial<5>::value kaçtır?

main.cpp
Factorial<5>::value
  • 60
  • 720
  • 25
  • 120 Doğru cevap

Açıklama: 5! = 5 * 4 * 3 * 2 * 1 = 120.

3 Parçayı rolüne eşle

Kavram Anlamı
template <int N> Tür olmayan parametre
Factorial<N-1>::value Recursive başvuru
template <> struct Factorial<0> Temel durum uzmanlaşması
Factorial<5>::value Sabit erişim

Uzman bölümündeki tüm dersler