Arrays em argumentos

De ccppbrasil.org

Quando se usa um array como argumento de função o número de elementos do array é perdido.
Por exemplo, escrever print(int a[5]), print(int a[]) ou print(int *a) é a mesma coisa, pois não é feita a checagem dos limites.

Abaixo segue um exemplo de como afirmar que é passado um array[] e não um array* e também como saber o seu limite.Como a função é baseada em templates o ideal é criar uma função não template aonde se passe o "size" e utilizar a função template apenas como chamadora. Este procedimento evita que o aplicativo final fique maior devido as instâncias de templates.
void print1(int a[5])
{
  for (int i =0; i < 5; i++)
   cout << a[i] << endl;
}

template<class T, int N>
void print2(T (&a)[N])
{
  for (int i =0; i < N; i++)
   cout << a[i] << endl;
}

int main()
{
  int x[] = { 1 , 2 , 3};
  print1(x); // esperava 5 ?! erro!
  print2(x); //ok
}
Ferramentas pessoais