其他答案是正确的,但我想补充一点,它可以反过来工作:
void RenderingEngine::Render(Visual *visuals, size_t n_visuals);
可以这样调用:
vector<Visual> visuals;
m_renderingEngine->Render(&visuals[0], visuals.size());
您只需获取第一个元素的地址并将其作为数组传递即可。这是有效的,因为向量的元素在内存中是按顺序排列的。(正如评论中指出的那样,当然不应该在新代码中使用它。定义你的方法来获取向量更安全,更容易。但是,如果你已经有一个接受指针的遗留函数,这允许你在您自己的代码中使用向量。)
它以这种方式工作的原因,而不是您问题中的方式(将指针传递给接受向量的函数),是因为在您的情况下,它无法在运行时确定数组的大小。但它必须知道构造向量的大小:
// (wrong code)
// Passing one element:
Visual visual;
m_renderingEngine->Render(&visual);
// Passing two elements, how does Render know that
// there are two elements at that address?
Visual[2] visuals;
m_renderingEngine->Render(&visuals[0]);
正如 Nawaz 指出的,您可以在 C++11 中执行类似的操作:
Visual visual;
m_renderingEngine->Render( {visual} ); // C++11
您还可以在{}
. 这只起作用,因为编译器可以在编译时告诉有多少元素。它只是语法糖:
vector<Visual> myVec = {visual}; // C++11
m_renderingEngine->Render(myVec);
反过来又像经典一样工作:
vector<Visual> myVec;
myVec.push_back(visual);
m_renderingEngine->Render(myVec);
(虽然 C++11 版本可能会稍微优化,但我不确定)。