template<typename T, size_t n> size_t array_size(const T (&)[n]) { return n; } 我没有得到的部分是此模板函数的参数。当我通过数组传递数组中n的元素数量时,数组会发生什么?
好吧,首先,您必须了解,尝试从数组中获取值可以为您提供指向其第一个元素的指针:
int a[] = {1, 2, 3}; int *ap = a; // a pointer, size is lost int (&ar)[3] = a; // a reference to the array, size is not lost 引用使用其确切类型或基类类型引用对象。关键是模板通过引用获取数组。作为参数的数组(不引用它们)在C ++中不存在。如果为参数提供数组类型,它将改为一个指针。因此,当我们想知道传递的数组的大小时,必须使用引用。大小和元素类型会自动推导出,这通常是功能模板的情况。以下模板
template<typename T, size_t n> size_t array_size(const T (&)[n]) { return n; } 用我们先前定义的数组调用a将隐式实例化以下函数:
size_t array_size(const int (&)[3]) { return 3; } 可以这样使用:
size_t size_of_a = array_size(a); 我前段时间做了一个变体[编辑:原来有人在这里有相同的想法],可以在编译时确定一个值。与其直接返回值,不如根据模板为模板提供返回类型n:
template<typename T, size_t n> char (& array_size(const T (&)[n]) )[n]; 您说如果数组具有n元素,则返回类型是对具有size n和element type 的数组的引用char。现在,您可以获得传递时数组的编译时确定的大小:
size_t size_of_a = sizeof(array_size(a)); 因为char具有n元素的数组的大小为sizeof n,所以也会给定数组中元素的数量。在编译时,您可以执行
int havingSameSize[sizeof(array_size(a))]; 因为从未真正调用过该函数,所以不
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。