2012-06-15 16 views
-4

下面的程序計算2上升到n,而不使用任何循環,運行時遞歸或庫函數[pow]。
它使用TEMPLATE METAPROGRAMING技術。2沒有任何循環或遞歸或庫函數n上升到電源

#include <iostream> 
using namespace std; 

template<int n> struct funStruct 
{ 
    enum { val = 2*funStruct<n-1>::val }; 
}; 

template<> struct funStruct<0> 
{ 
    enum { val = 1 }; 
}; 

int main() 
{ 
    cout << funStruct<8>::val << endl; 
    return 0; 
} 

我在徘徊,我可以使用函數代替結構嗎?

+4

這怎麼不能用遞歸?它發生在編譯時 - 但很明顯,因爲參數作爲模板參數傳遞,所以計算也在編譯時發生。 – tdammers

+1

這個特定的元編程例子的全部重點是2^n在編譯時(遞歸)計算,而不是運行時。 –

回答

6

顯而易見的解決方案,如@tdammes指出僅僅是一個非迭代的非遞歸方法:

constexpr int pow2(unsigned pwr) { 
    return 1 << per; 
} 

通過使用constexpr編譯器將在編譯時計算結果併產生編譯時間常量。如果你仍然想使用遞歸,您可以:

constexpr int pow2(unsigned pwr) { 
    return pwr==0? 1 : 2*pow2(pwr-1); 
} 

基本上是比略微更加簡潔易讀的方式你的元編程技巧同一編譯時遞歸。採用constexpr,當然,需要C++ 11,所以如果你沒有它,你可以隨時使用原始的元編程技巧,或@tdammers辦法適應:

template <unsigned int N> 
struct pow2 { 
    static const unsigned int value = 1 << N; 
}; 
+0

在第一個代碼示例中,每個=> pwr都存在錯誤的錯誤。 –

4

這是一種明顯的解決方案:

unsigned int power_of_two(unsigned int power) { 
    return (1 << power); 
} 

你可以支持簽署的權力,但是這將是在整數運算毫無意義的,因爲2所有負面力量都小於1,會降低截斷爲0