我知道还有其他方法可以实现这个或使用容器。这只是为了满足我的好奇心。假设我有以下代码:
void byref(int (&a)[5]);
int main()
{
int a[5];
byref(a);
}
通过引用传递C风格数组的一个优点是sizeof
将对其起作用,std::end
也是如此。但现在只能传递一个这么大的数组。
是否可以通过引用将较大数组的子集传递给此函数?例如,我想做:
int main()
{
int a[10];
byref(a + 1);
}
有没有办法让这项工作?
我让它构建并运行,在VS2015中给出了预期的值,但当然代码看起来非常狡猾:
byref(reinterpret_cast<int(&)[5]>(*(a + 1)));
答案 0 :(得分:1)
我只想把看起来不好的演员表包装成一个函数:
#include <iostream>
#include <cassert>
void byref(int (&a)[5])
{
std::cout << "Hello!" << std::endl;
}
template <size_t M, class T, size_t N>
T (&subarray(T (&a)[N], size_t start))[M]
{
assert(start < N && start + M <= N);
return reinterpret_cast<T(&)[M]>(a[start]);
}
int main()
{
int a[5], b[8];
byref(a);
byref(subarray<5>(subarray<6>(b, 0), 1));
}
答案 1 :(得分:0)
使用这个原型,我没有看到另一种方法,而不是铸造。
通常情况下,我也会看到这一个:byref((int(&)[5])*(b + 5));
,但当然它与你的相同并且不那么安全。
所以,我没有看到任何清晰而漂亮的方法(除了宏)。不过,我会提出你的问题,以便看看你是否遗漏了一些东西!