给定以下函数:
template<class T>
void foo(T* ar)
{
std::cout << sizeof(ar) / sizeof(ar[0]) << std::endl;
for (int i = 0; i < 6; i++)
std::cout << ar[i] << " ";
}
以及以下数组:
int ar[] = { 5, 1, 6, 8, 9, 3 };
foo(ar);
我希望程序打印“6”,然后打印数组的内容。但由于某种原因,sizeof(ar) / sizeof(ar[0])
评估结果为 1(因为两者sizeof(ar)
and sizeof(ar[0])
评估为“4”),但打印工作正常(意味着传递的数组确实包含所有 6 个元素)。
这种情况只发生在传递给函数的数组上(我尝试在 main() 中评估长度,其中声明了数组并且工作正常)。如何获取函数内数组的长度?
只需将参数声明为具有引用类型即可。
例如
template<class T>
void foo( const T &ar )
{
size_t n = sizeof(ar) / sizeof(ar[0]);
std::cout << n << std::endl;
for (int i = 0; i < n; i++)
std::cout << ar[i] << " ";
}
或者您可以使用以下声明
template<class T, size_t N>
void foo( const T ( &ar )[N] )
{
std::cout << N << std::endl;
for (int i = 0; i < N; i++)
std::cout << ar[i] << " ";
}
否则该函数处理指针。在这种情况下,您需要指定第二个参数来表示数组的长度,例如
template<class T>
void foo( const T* ar, size_t n )
{
std::cout << n << std::endl;
for (int i = 0; i < n; i++)
std::cout << ar[i] << " ";
}
由于传递的数组在函数中没有被更改,因此相应的参数应该具有限定符const
.
注意C++ 17 Standard中引入了标准函数std::size
在标头中声明<iterator>
可以使用的
而不是表达式sizeof(ar) / sizeof(ar[0])
所以你可以在第一个显示的函数中编写
size_t n = std::size(ar)`;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)