Получение указателя на конец массива - PullRequest
13 голосов
/ 21 января 2011

Я использую следующий шаблон для получения указателя, указывающего после последнего элемента массива:

template <typename T, size_t n>
T* end_of(T (&array)[n])
{
    return array + n;
}

Теперь я, кажется, помню, что с этим подходом была какая-то проблема, но я не могу вспомнить, что это было. Я считаю, что это было связано с выбором параметров типа или параметров функции, но я не уверен. Так что, как проверка работоспособности, вы видите какие-либо проблемы с приведенным выше кодом? Тест малого использования:

int test[] = {11, 19, 5, 17, 7, 3, 13, 2};
std::sort(test, end_of(test));

Ответы [ 3 ]

8 голосов
/ 21 января 2011

Ваше предложение не обязательно оценивается во время компиляции, оно зависит от оптимизации. Во время компиляции рассчитывается следующее:

template <typename T, size_t N> char (&array(T(&)[N]))[N];

int main()
{
  int myArray[10];

  std::cout << sizeof array(myArray) << std::endl;

  return 0;
}

Он работает, создавая тип массива char, который равен тому же количеству элементов, что и данный массив. sizeof всегда возвращает размер в количестве символов.

2 голосов
/ 21 января 2011

Единственная проблема, которую я вижу, состоит в том, что если вы никогда не знаете длину во время компиляции, ваш шаблон не будет знать, что туда вставить.Так что вам все равно придется сказать test+x или что-то еще, и теперь у вас есть два разных способа сделать одно и то же.

Лично я бы предпочел просто использовать vector<int> и, таким образом, иметь end()уже определено для меня.Если вам когда-нибудь понадобится массив, он доступен как &v[0].

1 голос
/ 21 января 2011

Вам также нужна версия const. Однако, насколько я знаю, с этим подходом проблем нет - я вижу, что он широко используется.

...