我有一个现有的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 Foo
到const 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的副本,但是在这种情况下提供的解决方案不起作用。我想这可能是因为函数定义了具有显式大小的数组引用,并且编译器不喜欢接受纯粹的指针(因为大小从类型中丢失)。
答案 0 :(得分:2)
我通过here找到的一个解决方案是通过void *
广告转换:
Foo (&c)[N] = *static_cast<Foo(*)[N]>(static_cast<void*>(my_vector.data()));
do_something(c);
这似乎正确编译和执行,并且可能不安全,除非可以保证函数使用的N
的值与向量的大小相同。