获取指向数组末尾的指针

时间:2011-01-21 13:02:16

标签: c++ arrays templates pointers pass-by-reference

我使用以下模板获取指向数组最后一个元素的指针:

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 个答案:

答案 0 :(得分:8)

您的提案未必在编译时进行评估,这取决于优化。以下是在编译时计算的:

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总是以字符数返回大小。

答案 1 :(得分:2)

我看到的唯一问题是,如果你在编译时不知道长度,你的模板就不会知道要放在那里的内容。所以你不得不说test+x或者其他东西,现在你有两种不同的方法可以做同样的事情。

就个人而言,我宁愿只使用vector<int>,因此已经为我定义了end()。如果您需要数组,则可以使用&v[0]

答案 2 :(得分:1)

你也需要一个const版本。但是,据我所知,这种方法没有实际问题 - 我认为它常用。