2

在下面的:

int c[10] = {1,2,3,4,5,6,7,8,9,0};

printArray(c, 10);

template< typename T >
void printArray(const T * const array, int count)
{
    for(int i=0; i< count; i++)
        cout << array[i] << " ";
}

我有点困惑,为什么模板函数的函数签名没有通过使用 [] 来引用数组作为数组,所以类似于const T * const[] array.

如何从模板函数签名中得知正在传递一个数组而不仅仅是一个非数组变量?

4

3 回答 3

9

你不能肯定地说。您必须阅读文档和/或从函数参数的名称中找出答案。但是由于您正在处理固定大小的数组,您可以这样编码:

#include  <cstddef> // for std::size_t

template< typename T, std::size_t N >
void printArray(const T (&array)[N])
{
    for(std::size_t i=0; i< N; i++)
        cout << array[i] << " ";
}

int main()
{
  int c[] = {1,2,3,4,5,6,7,8,9,0}; // size is inferred from initializer list
  printArray(c);
}
于 2012-12-10T22:22:41.643 回答
5

数组有大小。要创建对数组的引用,您需要静态提供大小。例如:

template <typename T, std::size_t Size>
void printArray(T const (&array)[Size]) {
    ...
}

此函数通过引用获取数组,您可以确定其大小。

于 2012-12-10T22:22:54.417 回答
0

您可以尝试以下方法:

template< std::size_t N>
struct ArrayType
{
    typedef int IntType[N];
};

ArrayType<10>::IntType content = {1,2,3,4,5,6,7,8,9,0};

template< std::size_t N >
void printArray(const typename ArrayType<N>::IntType & array)
{
    //for from 0 to N with an array
}
void printArray(const int * & array)
{
    //not an array
}

拉克斯万。

于 2012-12-10T22:29:48.890 回答