2013-08-14 6 views
5

भाज्य की गणना के लिए मैं उपयोग कर सकते हैं:रिकर्सिव टेम्पलेट metaprogramming

template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; }; 

template<> struct factorial<1> { enum { value = 1 }; }; //base Case 

और फिर

x=factorial<8>::value;

निम्नलिखित तो की तरह उपयोग कर सकते हैं, यह

के लिए इसी तरह की पुनरावर्ती टेम्पलेट प्राप्त करने के लिए संभव है
unsigned Log2(unsigned n, unsigned p = 0) { 
    return (n <= 1) ? p : Log2(n/2, p + 1); 
} 

मैं इस बारे में सोच सकता हूं:

template<int N,unsigned int P=0> struct Log2 
    { enum { value = Log2<N/2,P+1>::value }; }; 

लेकिन आधार केस कैसे सेट करें, यह नहीं पता।

template<> struct Log2<0,???> { enum { value = ???? }; }; 

कोई विचार?

उत्तर

8

आप आंशिक विशेषज्ञता इस्तेमाल कर सकते हैं सी ++ 11 में

template <unsigned p> 
struct Log2<0, p> { enum { value = p }; }; 

template <unsigned p> 
struct Log2<1, p> { enum { value = p }; }; 

, बजाय एक टेम्पलेट बनाने के बजाय, आप के बजाय constexpr को समारोह बदल सकती है।

constexpr unsigned Log2(unsigned n, unsigned p = 0) { 
    return (n <= 1) ? p : Log2(n/2, p + 1); 
} 

std::array<int, Log2(256)> x {{1, 2, 3, 4, 5, 6, 7, 8}}; 
//    ^^^^^^^^^ Just a compile-time function call. 
+0

धन्यवाद, मुझे लगता है कि यह 'value = p-1' होना चाहिए? – P0W

+0

@ पी 0 डब्ल्यू: ठीक है, मैं सिर्फ आपके कार्यान्वयन का उपयोग कर रहा हूं जो 'n' = '1' होने पर' p' देता है। – kennytm

+0

हाँ यह वास्तव में त्वरित प्रतिक्रिया के लिए 'constexpr' सुझाव – P0W

संबंधित मुद्दे