我想使用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
指针的类型不同。
答案 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()))};