【问题标题】:How to get size of an array using metaprogramming? [duplicate]如何使用元编程获取数组的大小? [复制]
【发布时间】:2011-03-07 19:36:32
【问题描述】:

可能重复:
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

【问题讨论】:

  • 我不确定你在问什么。您能否添加对问题和约束的更好描述?或者,如果您有一个部分想法,也许是一个解决方案的示例?
  • 稍微努力并搜索重复项。搜索框中的[c++]数组大小会提供多种解决方案。我可以在这里粘贴解决方案并获得一些代表。但请稍加努力,您已经在该网站上停留了足够长的时间,可以自己尝试和搜索。
  • @David 所以你来这里是为了回答问题或向人们展示他们无法搜索等?
  • @There:常见问题解答在顶部说:“请四处看看你的问题是否已经被问过(甚至可能已经回答了!)在你问之前。“你为什么认为你是豁免?
  • @我们无能为力:我在评论中提供了搜索条件,以便您将来可以考虑做类似的事情,以防您不知道可以搜索或可以使用搜索中的标签。当然,正如您前段时间所说,不打扰并要求其他人为您完成工作要容易得多......

标签: c++ metaprogramming


【解决方案1】:

对于一维数组,

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

【讨论】:

  • 最好使用枚举而不是静态整数。枚举始终是常量表达式。
  • @Crazy:我应该在哪里使用枚举?这就是投反对票的原因吗?
  • 您应该在元函数中使用枚举代替静态整数。否定是发布对您也关闭的问题的答案。
  • @Crazy:静态整数有什么问题?还有,为什么我不能回复一个问题,然后找到重复后关闭它?
【解决方案2】:

此功能存在于Boost.TypeTraits,特别是boost::rank&lt;&gt;boost::extent&lt;&gt;

如果您想知道如何它是如何完成的,请查看其他答案或 Boost 源代码。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2013-09-20
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多