Я также согласен, что приведенный выше метод Корвина очень хорош.
template <int N>
void foo(int (&x)[N])
{
std::cerr << N;
}
Я не думаю, что кто-то дал действительно вескую причину, почему это не очень хорошая идея.
Например, в Java мы можем написать что-то вроде:
int numbers [] = {1, 2, 3, 4};
for(int i = 0; i < numbers.length(); i++)
{
System.out.println(numbers[i]+"\n");
}
В C ++ было бы неплохо вместо того, чтобы говорить
int numbers [] = {1, 2, 3, 4};
int size = sizeof(numbers)/sizeof(int);
for(int i = 0; i < size; i++)
{
cout << numbers[i] << endl;
}
Мы могли бы сделать еще один шаг и пойти
template <int N>
int size(int (&X)[N])
{
return N;
}
Или, если это вызывает проблемы, я думаю, вы могли бы написать явно:
template < int N >
int size(int (&X)[N])
{
int value = (sizeof(X)/sizeof(X[0]));
return value;
}
Тогда нам просто нужно перейти на главную:
int numbers [] = {1, 2, 3, 4};
for(int i = 0; i < size(numbers); i++)
{
cout << numbers[i] << endl;
}
имеет для меня смысл: -)