Metaprogramming
- C++ kursu
- Uzman
- Ders 44/47
- 6 dk
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
#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
#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
template <> struct Factorial<0> { static const int value = ____; };
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?
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 |