Boost循环缓冲区,如何在填充时调用某些函数?
问题描述:
我喜欢Boost Templated Circular Buffer Container,但如何获得100%的填充?Boost循环缓冲区,如何在填充时调用某些函数?
#include <boost/circular_buffer.hpp>
int main() {
// Create a circular buffer with a capacity for 3 integers.
boost::circular_buffer<int> cb(3);
// Insert some elements into the buffer.
cb.push_back(1);
cb.push_back(2);
cb.push_back(3);
// Here I want some function to be called (for example one that would cout all buffer contents)
int a = cb[0]; // a == 1
int b = cb[1]; // b == 2
int c = cb[2]; // c == 3
return 0;
}
那么如何来听这样的事件在boost::circular_buffer
和例如COUT所有缓冲区的内容?
答
您可以将circular_buffer
实例包装到它自己的类中,并在其上实现事件处理。
class MyCircularBuffer
{
public:
MyCircularBuffer() : buffer(3) {}
void PushBack(int i)
{
buffer.push_back(i);
if(buffer.size() == 3)
{
// buffer is full!
}
}
private:
boost::circular_buffer<int> buffer;
};
如果外需MyCircularBuffer
通知该事件的代码,就可以实现Observer pattern的一些变种,使用Boost.Function或者使用一些其他的回调机制。
答
它不会触发事件。每次添加它时都必须手动检查它是否已满,如果是,则执行一些过程。
这通常通过将容器包装在用户创建的对象中完成,以便您可以监视添加到缓冲区的内容。或者,换句话说,你不需要一个通用的解决方案;或者,换句话说,你不需要一个通用的解决方案。只需编写一个使用容器的对象并自动刷新它。