2011-07-08 18 views
8

no.lu derlemelerde derleme zamanında faktöriyel hesaplamak istiyorum. Sorunu çözmek için bir yol buldum, ancak enum s kullanmadan bu sorun için başka bir çözüm olup olmadığını bilmek istiyorum. Burada enum s kullanarak çözüm. Hiçbir başka bir çözüm varsa enum s zorunluluk nedenDerleme zamanında sayı faktöryelerini hesaplamak mümkün mü, ancak

#include <iostream> 
template <int n> 
struct fact 
{ 
    enum{value = n*fact<n-1>::value}; 
}; 

template<> 
struct fact<1> 
{ 
    enum{value = 1}; 
}; 

int main() 
{ 
    std::cout << fact<10>::value; 
} 

açıklayın. Onlar derleme zamanında çözülecek varsayalım çünkü

değiştirin
+0

http://en.wikipedia.org/wiki/Template_metaprogramming, bu [örnek] (http. org/wiki/Template_metaprogramming # Compile-time_class_generation) – sehe

cevap

10

, Öyle yazıyor daha derleyiciler bu enum-stil gösteriminin kabul çünkü. Dil, satır içi başlatımlı const integral-tipi sınıf üyelerini destekler, ancak bazı derleyiciler bu bağlamda standartlarla uyumlu değildir. gayet güzel, bu konuda aşağıdaki eserlerini uyumlu derleyiciler üzerinde: //en.wikipedia:

#include <iostream> 
template <unsigned int n> 
struct fact 
{ 
    static const unsigned int value = n*fact<n-1>::value; 
}; 

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

int main() 
{ 
    std::cout << fact<10>::value << "\n"; 
} 
+0

aslında <0> muhtemelen temel durumda olmalıdır (0! = 1) –

+0

aynı çözüm http://en.wikipedia.org/wiki/Template_metaprogramming – sehe

+0

adresinde olmalıdır. Wikipedia makalede çözüm enum sürümünü kullanır. Enums kullanımı burada bir zorunluluk değildir. –

7

ile

enum{value}; 

,

static int const value; // or unsigned int 

enum s şarttır. Hangi hesapladığınız sonucun derleme zamanında yapılması gerektiğini garanti eder. Bu tip diğer tipler static int const'dur (tümleşik tip anlamına gelir).

göstermek için:

enum E { 
X = strlen(s); // is an error, because X is a compile time constant 
}; 
+0

Enumlar burada olmaz. Dil, bir başlangıç ​​değeri verilecek olan statik yapı üyelerine izin verir. Enumlar, sadece uyumlu olmayan derleyicilerde (görünüşte büyük miktarda olan) bir zorunluluktur. –

+0

@iammilind Cevabınız için teşekkürler. Statik int'nin neden kabul edilemez olduğunu niçin “statik int const” yazması gerektiğini bilmek isterim. –

+0

@Samvel, çünkü "statik int" derleme zamanında çözülmez; Böylece yapsanız bile. Derleme zamanı sabiti olmak ister. – iammilind

7

Alternatif olarak, statik const üye kullanabilirsiniz: alternatif gösterimler varken

template <unsigned int n> 
struct fact { static const unsigned int value = n * fact<n-1>::value; } 
İlgili konular