有人能解释给我数组大小的模板代码吗?

有人能解释给我数组大小的模板代码吗?

template<typename T, size_t n>size_t array_size(const T (&)[n]){
    return n;}

我没有得到的部分是这个模板函数的参数。当我将数组传递给n数组中元素的数量?


白板的微信
浏览 420回答 3
3回答

慕容森

首先,您必须理解,尝试从数组中获取值可以为您提供指向其第一个元素的指针:int&nbsp;a[]&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3};int&nbsp;*ap&nbsp;=&nbsp;a;&nbsp;//&nbsp;a&nbsp;pointer,&nbsp;size&nbsp;is&nbsp;lostint&nbsp;(&ar)[3]&nbsp;=&nbsp;a;&nbsp;//&nbsp;a&nbsp;reference&nbsp;to&nbsp;the&nbsp;array,&nbsp;size&nbsp;is&nbsp;not&nbsp;lost引用是指使用对象的确切类型或基类类型的对象。关键是模板通过引用接收数组。数组(而不是对它们的引用)作为参数在C+中不存在。如果您给一个参数一个数组类型,它将是一个指针。因此,当我们想知道传递数组的大小时,使用引用是必要的。大小和元素类型是自动推导出来的,就像函数模板的一般情况一样。以下模板template<typename&nbsp;T,&nbsp;size_t&nbsp;n>size_t&nbsp;array_size(const&nbsp;T&nbsp;(&)[n])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n;}使用我们先前定义的数组调用a将隐式实例化以下函数:size_t&nbsp;array_size(const&nbsp;int&nbsp;(&)[3])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;3;}可以这样使用:size_t&nbsp;size_of_a&nbsp;=&nbsp;array_size(a);一段时间前我编造了一个变体编辑:原来有人已经有了同样的想法这里]它可以在编译时确定一个值。它没有直接返回值,而是根据n:template<typename&nbsp;T,&nbsp;size_t&nbsp;n>char&nbsp;(&&nbsp;array_size(const&nbsp;T&nbsp;(&)[n])&nbsp;)[n];你说如果数组n元素时,返回类型是对具有大小的数组的引用。n元素类型char..现在,您可以获得已传递数组的编译时确定的大小:size_t&nbsp;size_of_a&nbsp;=&nbsp;sizeof(array_size(a));因为一个数组char有n元素有相当大的n,这也会给出给定数组中元素的数量。在编译时,所以您可以int&nbsp;havingSameSize[sizeof(array_size(a))];因为函数从来没有被真正调用过,所以它不需要被定义,所以它没有一个身体。希望我能把这件事弄清楚一点。

开心每一天1111

可以这样想,假设您有一堆函数://&nbsp;Note&nbsp;that&nbsp;you&nbsp;don't&nbsp;need&nbsp;to&nbsp;name&nbsp;the&nbsp;array,&nbsp;since&nbsp;you&nbsp;don't//&nbsp;actually&nbsp;reference&nbsp;the&nbsp;parameter&nbsp;at&nbsp;all.size_t&nbsp;array_size(const&nbsp;int&nbsp;(&)[1]){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;}size_t&nbsp;array_size(const&nbsp;int&nbsp;(&)[2]){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;2;}size_t&nbsp;array_size(const&nbsp;int&nbsp;(&)[3]){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;3;}//&nbsp;etc...现在,当您调用这个函数时,哪个函数会被调用?int&nbsp;a[2];array_size(a);现在,如果您将数组大小临时化,您将得到:template&nbsp;<int&nbsp;n>size_t&nbsp;array_size(const&nbsp;int&nbsp;(&)[n]){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n;}编译器将尝试实例化与调用它的任何参数匹配的数组_size版本。因此,如果您用一个10 int的数组调用它,它将用n=10实例化arraysize。接下来,只需将类型临时化,这样您就可以使用多个int数组来调用它了:template&nbsp;<typename&nbsp;T,&nbsp;int&nbsp;n>size_t&nbsp;array_size(const&nbsp;T&nbsp;(&)[n]){ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n;}你就完蛋了。编辑*关于(&)控件周围需要括号。&若要区分int引用数组(非法)和INT数组(您想要什么),请执行以下操作。因为.的优先[]高于&,如果你有以下声明:const&nbsp;int&nbsp;&a[1];由于运算符优先,您将得到一个对int的const引用的单元素数组。如果你想&首先,您需要强制使用括号:const&nbsp;int&nbsp;(&a)[1];现在,您有一个对一个元素数组的INT的Const引用。在函数参数列表中,如果不使用参数,则不需要指定参数的名称,因此可以删除名称,但保留括号:size_t&nbsp;array_size(const&nbsp;int&nbsp;(&)[1])

忽然笑

数组没有发生任何变化。它是一个未使用的参数,用于解析模板函数的签名。它也不能用作模板参数,但这是一个单独的nit。
打开App,查看更多内容
随时随地看视频慕课网APP