按引用传递数组 - 更大数组的子集

时间:2015-10-24 19:59:16

标签: c++

我知道还有其他方法可以实现这个或使用容器。这只是为了满足我的好奇心。假设我有以下代码:

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)));

2 个答案:

答案 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));,但当然它与你的相同并且不那么安全。

所以,我没有看到任何清晰而漂亮的方法(除了)。不过,我会提出你的问题,以便看看你是否遗漏了一些东西!