使用回调使用来自 std::vector <uint8_t>的数据

  • 本文关键字:数据 uint8 vector 回调 std c++
  • 更新时间 :
  • 英文 :


根据前面的答案,我编写了一个可以快速使用的更好的缓冲区:

#include <iostream>
#include <vector>
#include <functional>
#include <stdio.h>
#include <string.h>
using namespace std;
template <class T>
class Buffer
{
public:
Buffer(size_t reserve) {
_buffer.reserve(reserve);
}
void write(T* buffer, size_t amountToWrite) {
this->_buffer.insert(this->_buffer.begin(), buffer, buffer + amountToWrite);
}
size_t consume(const size_t amountToConsume, std::function<void(T*, T*)> onConsume) {
if (_current==this->_buffer.size()) {
//this means we've already read everything. Maybe we should throw or just return 0?
return 0; 
}
size_t currentActualSize = this->_buffer.size() - this->_current;
if (amountToConsume <= currentActualSize) {
onConsume(this->_buffer.data() + this->_current, this->_buffer.data() + this->_current + amountToConsume);
this->_current += amountToConsume;
return amountToConsume;
} else {
size_t remaining = currentActualSize;
onConsume(this->_buffer.data() + this->_current, this->_buffer.data() + this->_current + remaining);
this->_current += remaining;
return remaining;
}
}
private:
std::vector<T> _buffer;
size_t _current = 0;
};
int main()
{
Buffer<uint8_t> b(7);
uint8_t u[] = {1,2,3,4,5,6,7};
b.write(u, 7);
uint8_t r[3] = {255, 255, 255};

size_t consumedBytes2 = b.consume(3, [r](const uint8_t* begin, const uint8_t* end){
std::cout << "begin: " << begin << ", end: " << end << std::endl;
std::copy(begin, end, (uint8_t*)r);
});

std::cout << "consumed " << consumedBytes2 << std::endl;
for(int i=0; i<consumedBytes2; i++) {
std::cout << (int) r[i] << " - ";
}

std::cout << std::endl;
return 0;
}

,我添加了一个回调,调用缓冲区的开始和结束,所以我可以随时写入,而不是复制到一个临时缓冲区,然后再写入另一个缓冲区。

但是,正如您所看到的,输出是:
begin: , end:                                                                                                                                                         
consumed 3                                                                                                                                                            
255 - 255 - 255 -   

没有东西被写入到我的缓冲区。

发生了什么事?

您正在按值捕获数组。

通过引用捕获将得到预期的结果。

size_t consumedBytes2 = b.consume(3, [&r](const uint8_t* begin, const uint8_t* end){
std::cout << "begin: " << begin << ", end: " << end << std::endl;
std::copy(begin, end, (uint8_t*)r);
});

按值捕获指针可以正常工作,但是这里的数组不会像传递给函数时那样衰减为指针。