我使用以下模板获取指向数组最后一个元素的指针:
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));
答案 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版本。但是,据我所知,这种方法没有实际问题 - 我认为它常用。