2011-03-07 60 views
-1

可能重複:
Use templates to get an array's size and end address如何使用元編程獲取數組的大小?

Can someone explain this template code that gives me the size of an array?(第一個答案包括獲得的值作爲一個編譯時間常數)

如何獲得使用元編程數組的大小?多維也將讚賞。 因此,舉例來說,如果我傳遞一個類型這個結構(它是如何以往任何時候都調用,讓我們說get_dim)我會得到:

get_dim<int>::value; //0 
get_dim<int[1]>::value //1 
get_dim<int[2][3]>::value //2,3 
+0

我不確定你在問什麼。你能否更好地描述問題和限制?或者,也許是一個解決方案的例子,如果你有一個局部的想法? – Karmastan 2011-03-07 19:41:06

+5

稍作努力**搜索重複**。 * [C++]數組大小*在搜索框中將提供多種解決方案。我可以在這裏粘貼解決方案並獲得一些代表。但請僅做點半點努力**,你已經在這個網站上搜索了足夠長的時間來嘗試自己搜索。 – 2011-03-07 19:45:28

+1

@David讓你來這裏回答問題或向人們展示他們無法搜索等等。 – 2011-03-07 19:57:53

回答

4

對於一個維數組,

template<typename T, size_t N> 
size_t size_of_array(T (&)[N]) 
{ 
    return N; 
} 

int arr[]={1,2,2,3,4,4,4,54,5}; 
cout << size_of_array(arr) << endl;  

A a[] = {A(),A(), A(), A(), A()}; 
cout << size_of_array(a) << endl; 

輸出:

9 
5 

全部演示在Ideone:http://ideone.com/tpWk8


編輯:

另一種方式(後看到你的編輯),

template<typename T> 
struct get_dim; 

template<typename T, size_t N> 
struct get_dim<T[N]> 
{ 
    static const int value = N; 
}; 

int main() 
{ 
     cout << get_dim<int[100]>::value; 
     return 0; 
} 

輸出:

100 

http://ideone.com/wdFuz


編輯:

對於二維陣列:

struct size2D 
{ 
    size_t X; 
    size_t Y; 
}; 

template<typename T, size_t M, size_t N> 
size2D size_of_array(T (&)[M][N]) 
{ 
    size2D s = { M, N}; 
    return s; 
} 
int arr[][5]={ {1,2,2,5,3}, {4,4,4,54,5}} ; 
size2D size = size_of_array(arr); 
cout << size.X <<", "<< size.Y << endl; 

輸出:

2, 5 

代碼:http://ideone.com/2lrUq

+0

更好地使用枚舉而不是靜態整數。枚舉總是常量表達式。 – 2011-03-07 21:28:11

+0

@Crazy:我應該在哪裏使用枚舉?那是downvote的原因嗎? – Nawaz 2011-03-08 00:59:32

+0

您應該在您的元功能中使用枚舉代替靜態整數。否定的是發佈你也關閉的問題的答案。 – 2011-03-08 01:25:39

4

此功能是存在於Boost.TypeTraits,具體而言,boost::rank<>boost::extent<>

如果您想知道如何完成,請參閱其他答案或Boost源代碼。