向量到指针转换

时间:2015-11-24 08:34:46

标签: c++ api vector struct

我需要调用一个需要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作为指针传递,但它当然仍然是一个不同的对象。

有没有机会让我的工作正常进行?什么可能的方法?

3 个答案:

答案 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]);