怎么在数组相关的模板函数中,判断数组长度?

1.目标:写一个模板函数,能输出数组。
2.问题:如何在函数中判断数组的长度?

我写的代码如下:

template <typename T>
void myPrint(const T& arr)
{
    for (int i = 0; i < sizeof(arr)/sizeof(T); i++)
        cout << arr[i] << " ";
}

运行下来会少很多数据。
想知道sizeof(T)和sizeof(arr[0])有什么区别

sizeof(数组)
注意,这里的sizeof是运算符,不是函数,运算符和函数的区别是,sizeof是编译器来计算的,而不是运行的时候来计算。
因此,c语言只能知道作为局部变量的数组的长度,因为根据代码定义可以知道。
作为函数参数,数组的长度不知道,因为任何数组都可以传过来,没法固定,不能计算。
总结下,c/c++和java不同,数组没有额外的存储它长度的机制,不能通过函数求出数组的长度。
这就是为什么你看包括系统库函数在内,c/c++的很多函数在传入数组的时候,还要另一个参数n由调用者传入数组长度的原因。

向函数模板myPrint传递数组时,模板实参T的类型是数组而不是数组元素的类型,所以sizeof(arr)和sizeof(T)的值是相等的,myPrint只输出数组的第一个元素。例如:

    int arr[] = { 1, 2, 3};
    myPrint(arr);           // 调用myPrint<int [3]>(const int [3]&),T是int[3]

下面是修改后的代码:

template <typename T, size_t Size>
void PrintArray(const T(&arr)[Size])
{
    for(int i = 0; i < Size; ++i)
        cout << arr[i] << " ";
    cout << endl;
}

template <typename T, size_t Size>
void PrintArray_v2(const T* arr)
{
    for(int i = 0; i < Size; ++i)
        cout << arr[i] << " ";
    cout << endl;
}

template <typename T>
void myPrint(const T& arr)
{
    for (int i = 0; i < sizeof(arr)/sizeof(T); i++)
        cout << arr[i] << " ";
}

int main(int argc)
{
    int arr1[] = { 1, 2, 3, 4, 5 };
    char arr2[] = "ABCDEFG";

    PrintArray(arr1);                // PrintArray<int,5>(const int[5]&), T是int, Size = 5
    PrintArray(arr2);                // PrintArray<char,8>(const char[8]&), T是char, Size = 8

    PrintArray_v2<int, 3>(arr1);     // PrintArray_v2<int,3>(const int*), T是int, Size = 3
    PrintArray_v2<char, 3>(arr2);    // PrintArray_v2<char,3>(const char*), T是char, Size = 3

    int x = 3;
    // myPrint(x);           // error : “arr[i]”下标要求数组或指针类型
    // PrintArray(x);        // error : 未能从“int”为“const T (&)[Size]”推导模板参数
    return 0;
}

注意比较声明数组和数组引用的区别:

    const size_t N = 3;
    int a1[N];               // 数组
    int(&a2)[N] = a1;        // 数组引用