2008-11-07 72 views
2

有沒有辦法根據模板預先計算一個值的數組?在下面的例子中,我想'powers_of_2'數組在編譯時計算256個值,如果可以的話,不必輸入所有的值。如何預先計算值的數組?

#include <iostream> 
using namespace std; 

template <int X, char Y> 
struct power { 
    enum { value = X * power<X,Y-1>::value }; 
}; 

template <int X> 
struct power<X,1> { 
    enum { value = X }; 
}; 

template <int X> 
struct power<X,0> { 
    enum { value = 1 }; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int powers_of_2[] = { power<2,0>::value, power<2,1>::value, ..., power<2,255>::value }; 
    cout << powers_of_2[1] << endl; 
    return 0; 
} 
+0

其實現在我再次看看你的問題(溢出問題除外),看起來你已經有了答案。 ??? – grieve 2008-11-07 16:43:04

回答

1

這正是一個宏...

4

是很有用的,除非你打算使用一個大的整數,包你將在2^32溢出的整數類型(或2^64,視) ,但回答你真正的問題看看這個維基百科文章template metaprogramming

+0

我修改了我的問題,所以Y現在是char類型而不是int。 – Mike 2008-11-07 16:50:00

0

您可以輕鬆編寫一個小腳本,使用您喜歡的腳本語言爲您預先填充陣列。根據您使用的編譯器和預處理器,您應該也可以將其作爲宏來執行。

1

保持值2^255需要32個字節。這不能在int中進行;你需要一個字符數組

typedef unsigned char BYTE32[32]; 
BYTE32 powers_of_2[256] = 
{ 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, 
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0}, 
// : 
// : 
    {32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
    {64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
    {128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} 
}; 
0

我Lokkju同意。不可能僅通過模板元編程來初始化數組,在這種情況下,宏是非常有用的。即使Boost庫也使用宏來實現重複性語句。有用的宏

例子都可以在這裏:http://awgn.antifork.org/codes++/macro_template.h

1

我在這樣的情況下,做的是寫一個小程序,生成和C++源代碼寫入到一個文件中的數組初始化,然後#包括該文件。這種技術簡單而有效。