我需要调用一个需要struct-pointer作为参数的API函数。
让我们说这个结构
struct SomeObject{
double a;
double b;
}
和此函数调用:func(SomeObject*)
这里的问题是我只能访问数据作为自定义结构,但是像SomeObject一样的结构作为向量。
struct CustomObject{
double a;
double b;
}
编译器抛出错误是因为它们是不同的参数。 cannot convert 'std::vector<CustomObject>' to 'SomeObect*' in argument passing
。我已经尝试将CustomObject作为指针传递,但它当然仍然是一个不同的对象。
有没有机会让我的工作正常进行?什么可能的方法?
答案 0 :(得分:4)
您无法将std::vector
传递给需要指针的函数。如果函数需要指向数组的指针,那么可以使用std::vector::data
现在,我们遇到的问题是向量包含错误类型的对象。当您需要std::vector::data
时,CustomObject*
返回的指针将为SomeObject*
类型。他们是无关的,但是相同的类型,幸运的是,standard layout types。只要这两个要求成立,就可以保证类型具有相同的表示形式。因此,我们可以简单地使用reinterpret_cast:
func(reinterpret_cast<SomeObject *>(vec.data()));
编译器现在显示'抛弃限定符'。它似乎有问题,因为CustomObject当前是const。
我认为这意味着向量是const
,或者它是const
个对象的向量。在这种情况下,你不应该将它的数据传递给一个指向非const
的指针的函数。但是如果你知道函数不会修改对象,尽管指针指向非const,并且你想要摆脱编译器警告,那么你必须使用const_cast明确地强制转换constness。 / p>
答案 1 :(得分:1)
reinterpret_cast
可能会“解决”问题。问题,但已使你的代码非常脆弱。我真的不推荐这种做法。
相反,我会从SomeObject
手动构建CustomObject
:
SomeObject x;
x.a = myCustomObj.a;
x.b = myCustomObj.b;
func(&x);
这也避免了const
问题。在这个阶段,甚至不要认为关于优化或效率。 YAGNI。
答案 2 :(得分:-1)
func((SomeObject *)&obj[0]);