如何使用元编程获得数组的大小?

The*_* do 0 c++ metaprogramming

可能重复:
使用模板获取数组的大小和结束地址

有人可以解释这个模板代码,它给我一个数组的大小?(第一个答案包括获取值作为编译时间常量)

如何使用元编程获得数组的大小?多维也将受到赞赏.所以例如,如果我将一个类型传递给这个结构(如何调用它,让我们说get_dim)我会得到:

get_dim<int>::value; //0
get_dim<int[1]>::value //1
get_dim<int[2][3]>::value //2,3
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 5

对于一维数组,

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;
Run Code Online (Sandbox Code Playgroud)

输出:

9
5
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

100
Run Code Online (Sandbox Code Playgroud)

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; 
Run Code Online (Sandbox Code Playgroud)

输出:

2, 5
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,很好的答案. (2认同)