gpt4 book ai didi

c++ - 有人可以解释这个给我数组大小的模板代码吗?

转载 作者:IT老高 更新时间:2023-10-28 13:20:52 26 4
gpt4 key购买 nike

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);

我前段时间编造了一个变体[编辑:原来有人已经有了同样的想法here ] 可以在编译时确定一个值。它不是直接返回值,而是根据 n 为模板提供返回类型:

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

如果数组有 n 元素,则返回类型是对大小为 n 且元素类型为 char 的数组的引用。现在,您可以获得传递数组的编译时确定的大小:

size_t size_of_a = sizeof(array_size(a));

因为具有 n 元素的 char 数组的大小为 n,这也会为您提供给定数组中元素的数量。在编译时,你可以这样做

int havingSameSize[sizeof(array_size(a))];

因为该函数实际上从未被调用过,所以不需要定义它,所以它没有主体。希望我能把这件事弄清楚一点。

关于c++ - 有人可以解释这个给我数组大小的模板代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/437150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com