2011-07-08 8 views
8

मैं संकलन समय पर फैक्टोरियल की गणना करना चाहता हूं। मुझे समस्या को हल करने का कोई तरीका मिला, लेकिन मैं जानना चाहता हूं कि इस समस्या के लिए enum एस का उपयोग किए बिना कोई और समाधान है या नहीं। यहां enum एस का उपयोग कर समाधान।संकलन समय पर संख्या फैक्टरियल की गणना करना संभव है, लेकिन बिना अंक के

#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; 
} 

अगर कोई एक समाधान है, तो बताएं कि enum रों आवश्यक हैं।

+0

http://en.wikipedia.org/wiki/Template_metaprogramming, यह [एक नमूना] (http है। संगठन/विकी/Template_metaprogramming # संकलन-समय_class_generation) – sehe

उत्तर

10

जबकि वहाँ विकल्प अंकन कर रहे हैं, ऐसा नहीं है कि जिस तरह से लिखा है, क्योंकि अधिक compilers कि enum शैली अंकन स्वीकार करते हैं। भाषा एक इनलाइन प्रारंभिकता वाले कॉन्स अभिन्न प्रकार के वर्ग सदस्यों का समर्थन करती है, लेकिन कुछ कंपाइलर उस संबंध में मानक के अनुरूप नहीं हैं। compilers कि ठीक इस संबंध में शिकायत कर रहे हैं, निम्न कार्य करता पर: //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

तथ्य <0> शायद मूल मामला होना चाहिए (0! = 1) –

+0

वही समाधान http://en.wikipedia.org/wiki/Template_metaprogramming – sehe

+0

पर पाया जा सकता है विकिपीडिया लेख में समाधान enum संस्करण का उपयोग करता है। Enums का उपयोग यहां जरूरी नहीं है। –

7

बदलें,

enum{value}; 
साथ

,

static int const value; // or unsigned int 

enum रों क्योंकि वे संकलन समय पर हल किया जाना लगता है आवश्यक हैं। जो आश्वस्त करता है कि आप जिस भी परिणाम की गणना करते हैं उसे संकलन समय पर किया जाना चाहिए। ऐसे अन्य प्रकार static int const (किसी भी अभिन्न प्रकार का मतलब है)।

इसे समझने के लिए:

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

Enums यहां जरूरी नहीं है। भाषा अभिन्न प्रकार के स्थिर कॉन्स सदस्यों को प्रारंभिक मान प्रदान करने की अनुमति देती है। Enums केवल गैर अनुपालन संकलक पर होना चाहिए (जो स्पष्ट रूप से महान बहुतायत में हैं)। उत्तर के लिए –

+0

@iammilind धन्यवाद। मैं जानना चाहता हूं कि इसे 'स्थैतिक int const' क्यों लिखना चाहिए क्यों 'स्थिर int' स्वीकार्य नहीं है। –

+0

@ सैमवेल, क्योंकि 'स्थैतिक int' संकलन समय पर हल नहीं किया गया है; इस प्रकार यदि आप इसे करते हैं। यह एक संकलन समय निरंतर होना चाहिए। – iammilind

7

वैकल्पिक रूप से, आप स्थिर स्थिरांक सदस्यों का उपयोग कर सकते हैं:

template <unsigned int n> 
struct fact { static const unsigned int value = n * fact<n-1>::value; } 
संबंधित मुद्दे