2

给定以下功能:

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)评估sizeof(ar[0])为 '4'),但打印工作正常(意味着传递的数组确实包含所有 6 个元素)。

这只发生在传递给函数的数组上(我尝试在 main() 中评估长度,其中声明了数组并且工作正常)。如何获取函数内数组的长度?

4

1 回答 1

3

只需将参数声明为具有引用类型即可。

例如

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] << " ";
}

由于传递的数组在函数中没有被更改,因此相应的参数应该有 qualifier const

请注意,在 C++ 17 标准中,引入std::size了在标头中声明的标准函数<iterator>,可以用来代替表达式sizeof(ar) / sizeof(ar[0])

因此,您可以例如在第一个显示的函数中编写

size_t n = std::size(ar)`;
于 2020-04-21T08:45:51.527 回答