Boost循环缓冲区指针访问(c ++)

时间:2017-05-14 05:09:52

标签: boost iterator buffer circular-buffer

我想使用Boost循环缓冲区来存储由硬件API生成的数组。 API接收内存位置的地址并相应地推送数组。所以我有以下内容:

typedef unsigned char API_data [10];

boost::circular_buffer<API_data> data(10);
boost::circular_buffer<API_data>::iterator it = data.begin();

但我无法将指针it传递给API,因为:

  

&#34; boost::cb_details::iterator<boost::circular_buffer<API_data, std::allocator<API_data>>, boost::cb_details::nonconst_traits<boost::container::allocator_traits<std::allocator<API_data>>>>&#34;没有合适的转化功能至LPVOID存在。

API期望指针类型为LPVOID,但it指针的类型不同。

1 个答案:

答案 0 :(得分:0)

循环缓冲区API类似于::std::vector API。但是有一个问题!首先,存储在循环缓冲区中的项目必须是可复制的,因此您无法在其中存储原始数组。其次,您在构造函数中提供容器容量,而不是初始容器大小,因此在尝试将指针传递给存储项之前,您需要确保它存在。如果缓冲区已满,则推入循环缓冲区可能会删除最旧的项目,而std::vector将始终增长。然后,您可以获得对推送项的引用,并将其转换为指向void的指针。

using API_data_buffer = ::std::array< unsigned char, 10 >;

::boost::circular_buffer< API_data_buffer > buffers(10); // buffers is still empty!
buffers.push_back();
auto & api_data_buffer{buffers.back()};
auto const p_void_api_data{reinterpret_cast< void * >(reinterpret_cast< ::std::uintptr_t >(api_data_buffer.data()))};