2011-08-19 29 views
1

我喜欢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所有缓冲区的内容?

回答

3

您可以将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或者使用一些其他的回调机制。

1

它不会触发事件。每次添加它时都必须手动检查它是否已满,如果是,则执行一些过程。

这通常通过将容器包装在用户创建的对象中完成,以便您可以监视添加到缓冲区的内容。或者,换句话说,你不需要一个通用的解决方案;或者,换句话说,你不需要一个通用的解决方案。只需编写一个使用容器的对象并自动刷新它。