我有一个具有以下签名的功能,我无法更改:
bool function(uint8_t*& data, uint32_t size)
我想传递一个标准向量,我能够按如下方式进行:
std::vector<uint8_t> buffer;
buffer.reserve(10);
buffer.resize(10);
uint8_t* data = &buffer[0];
function(data, buffer.size()))
有没有办法避免创建data
指针?以下不编译:
function(&buffer[0], buffer.size()))
发出no matching function
错误。
答案 0 :(得分:3)
这里的主要问题是,如果function
接受对指针的引用,它可能会修改它,这会导致意外的结果。
如果您确定该函数不会修改指针本身,您可以添加一个重载来简化您想要完成的任务:
bool function(uint8_t*& data, uint32_t size) {
return false;
}
// overloaded on rvalue reference to pointer
bool function(uint8_t*&& data, uint32_t size) {
return function(data, size);
}
int main() {
std::vector<uint8_t> buffer;
buffer.reserve(10);
buffer.resize(10);
function(buffer.data(), buffer.size());
}
考虑到这是危险,特别是如果function
修改了指针,请谨慎使用。
答案 1 :(得分:2)
你可能需要这个:
uint8_t* data = buffer.data(); // data will point to the first element of the vector
function(data, buffer.size());
// function may have modified the data pointer at this point
现在我很有意思function
究竟是什么,特别是如果它确实修改了data
。
顺便说一句:IMO buffer.reserve(10);
没用,因为你之后还有buffer.resize(10);
。