C ++:将std :: vector的内容作为对数组的引用

时间:2017-08-14 02:47:51

标签: c++ arrays vector struct static-cast

我有一个现有的C ++ API函数,如下所示:

void do_something(const Foo (&input_array)[N]);

我认为这需要一个N个连续分配的Foo结构的数组,通过引用。例如,我可以传入一个数组:

Foo my_array[N] = { ... }
do_something(my_array);

在我的真实代码中,我有一个std::vector<Foo>,我理解的内容可以像使用.data()成员函数的数组一样对待,但是下面会导致编译器(clang)错误:

// Say N is 2:
std::vector<Foo> my_vector(N);
// ...initialise vector values...
do_something(*my_vector.data());

它抱怨从const Fooconst Foo [2]没有可行的转换。

我知道C ++认为数组大小被认为是该类型的一部分。在这种情况下,什么是正确的类型转换?我得到了这个:

  auto my_vector_as_array = static_cast<const Foo & [N]>(*my_vector.data());

然而,编译器对使用[N]甚至[]作为静态强制转换类型参数的一部分感到不满意,抱怨说:

error: 'type name' declared as array of references of type 'const Foo &'

有没有办法正确地将std::vector的内容强制转换为此函数?

这里是完整的代码:

#include <iostream>
#include <vector>
#define N 4

struct Foo { int a; int b; float c; };

void do_something(const Foo (&input_array)[N]) {
  for (size_t i = 0; i < N; ++i) {
    std::cout << i << ": " << input_array[i].a << ", " << input_array[i].b << ", " << input_array[i].c << std::endl;
  }
}

int main(int argc, char * argv[]) {
  // pass a C-style array by reference:
  Foo my_array[N] = { {1, 10, 100.0}, {2, 20, 200.0}, {3, 30, 300.0}, {4, 40, 400.0} };
  do_something(my_array);

  // try to do the same with the contents of a vector:
  std::vector<Foo> my_vector(N);
  my_vector[0] = {1, 10, 100.0};
  my_vector[1] = {2, 20, 200.0};
  my_vector[2] = {3, 30, 300.0};
  my_vector[3] = {4, 40, 400.0};

  // this fails to compile:
  do_something(*my_vector.data());

  // try casting via a temporary variable - also fails to compile:
  auto my_vector_as_array = static_cast<const Foo & []>(*my_vector.data());
  do_something(my_vector_as_array);
}

编辑:有人建议这是this question的副本,但是在这种情况下提供的解决方案不起作用。我想这可能是因为函数定义了具有显式大小的数组引用,并且编译器不喜欢接受纯粹的指针(因为大小从类型中丢失)。

1 个答案:

答案 0 :(得分:2)

我通过here找到的一个解决方案是通过void *广告转换:

Foo (&c)[N] = *static_cast<Foo(*)[N]>(static_cast<void*>(my_vector.data()));
do_something(c);                                           

这似乎正确编译和执行,并且可能不安全,除非可以保证函数使用的N的值与向量的大小相同。